Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отслеживание подключения USB устройств на WinApi 
:(
    Опции темы
maloicds
Дата 28.1.2011, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 20.10.2009
Где: Москва

Репутация: нет
Всего: нет



Доброго времени суток. Пишу программу для отслеживания подключения USB устройств на WinApi. Вот код:
Код

program usb;

uses
  windows, messages,
  dialogs, sysutils;  // для тестов

var WClass:TWndClass;
     hWnd:THandle;
     mMsg:TMsg;

function WndProc(hWn:Thandle;mMsg,wParam,lParam:integer):integer; stdcall; 
begin 
   Case mMsg of
     WM_DESTROY:halt(0);
     WM_DEVICECHANGE: ShowMessage(inttostr(wparam)+' '+inttostr(lparam));
   end;
 result:=DefWindowProc(hWn,mMsg,wParam,lParam);
end;

begin
 with WClass do
  begin 
   lpfnWndProc:=@WndProc;
   lpszClassName:='My';
  end;
  RegisterClass(WClass);
  hWnd:=CreateWindow('My','',WS_OVERLAPPEDWINDOW,0,0,0,0,0,0,hInstance,nil);
 while GetMessage(mMsg, hWnd , 0, 0) do
  begin 
   TranslateMessage(mMsg);
   DispatchMessage(mMsg);
  end; 
 
end.


Проблема в том, что сообщение WM_DEVICECHANGE отлавливает все события от устройств (значения wParam и lParam всегда одинаковы) , а мне надо только от флешек.
На форуме много примеров с компонентами и с формами, но вот заставить это работать на WinApi не получается!
PM MAIL   Вверх
alexnef
Дата 14.2.2011, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 14.4.2010

Репутация: нет
Всего: нет



Код

type
  pdev_broadcast_hdr = {^DEV_BROADCAST_DEVICEINTERFACE;
  DEV_BROADCAST_DEVICEINTERFACE =} record
     dbch_size: dword;
     dbch_devicetype: dword;
     dbch_reserved: dword;
     handle: thandle;
     hnotif: pointer;
     guid: tguid;
     name: ulong;
     data: byte;     
  end;

var
pt:dword;
i,sz: integer;
mask: dword;
ch: char;
begin
  //
if (Msg.wParam = DBT_DEVICEARRIVAL) then //
   begin
      if msg.LParam<>0 then
      if integer(pointer(msg.LParam+4)^)=DBT_DEVTYP_VOLUME then
      begin           // съемный диск или флешка
         i:=1 ;
         mask:=cardinal(pointer(msg.LParam+12)^);
         for ch:='A' to 'Z' do
         begin
           if mask and i<>0 then
           begin
              //
              sz:=sizeof(pdev_broadcast_hdr{DEV_BROADCAST_DEVICEINTERFACE});
              zeromemory(@pdev_hdr,sz);
              pdev_hdr.dbch_size:=sz;        //     DBT_DEVTYP_VOLUME
              pdev_hdr.dbch_devicetype:=DBT_DEVTYP_HANDLE;
              pdev_hdr.dbch_reserved:=0;
              pdev_hdr.handle:=createfile(pchar(ch+':\'),
                               GENERIC_READ,
                               FILE_SHARE_READ or FILE_SHARE_WRITE,
                               nil,
                               OPEN_EXISTING,
                               FILE_FLAG_BACKUP_SEMANTICS,
                               0);
              if pdev_hdr.handle<>$ffffffff then
              hdevnot[ch]:=registerdevicenotification(mainform.Handle,@pdev_hdr,0);{ сообщаем системе , что мы хотим принимать все    сообщения связаные с этим устройством}
              if hdevnot[ch]=nil then
                 begin
                 messagebox(application.handle,
                      pchar('Can not watch for device '+ch+':\ notifications'),
                      pchar('Error!'),mb_iconexclamation);
                 end;
              closehandle(pdev_hdr.handle);
              break;
           end;
         i:=I*2;
         end;
      end;
   end;


собственно тебе нужно только

Код

if (Msg.wParam = DBT_DEVICEARRIVAL) then //
   begin
      if msg.LParam<>0 then
      if integer(pointer(msg.LParam+4)^)=DBT_DEVTYP_VOLUME then
      begin           // съемный диск или флешка
      
      End;


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0420 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.