Конференция "WinAPI" » Получение "ИД оборудования" после подключения/отключения USB [D7, WinXP]
 
  • MOM (06.10.17 15:53) [0]
    Добрый день.

    По сабжу, у меня есть много USB устройств, а контролировать отключение и включение нужно только одного устройства. Флешки и т.п. вынимать можно, но вот со сканером отпечатков пальцев играться нельзя, вот хотелось бы отлавливать таких нарушителей.

    Само событие по которому происходит подключение/отключение я нашел, но вот как быть дальше?


    unit Unit1;

    interface

    uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs, StdCtrls;

    type
     PDevBroadcastHdr  = ^DEV_BROADCAST_HDR;
     DEV_BROADCAST_HDR = packed record
        dbch_size: DWORD;
        dbch_devicetype: DWORD;
        dbch_reserved: DWORD;
     end;

     PDevBroadcastDeviceInterface  = ^DEV_BROADCAST_DEVICEINTERFACE;
     DEV_BROADCAST_DEVICEINTERFACE = record
        dbcc_size: DWORD;
        dbcc_devicetype: DWORD;
        dbcc_reserved: DWORD;
        dbcc_classguid: TGUID;
        dbcc_name: short;
     end;

     TForm1 = class(TForm)
       lst1: TListBox;
       procedure FormCreate(Sender: TObject);
       procedure FormDestroy(Sender: TObject);
     private
       FWindowHandle: HWND;
       procedure WndProc(var Msg: TMessage);
       function USBRegister: Boolean;
       procedure WMDeviceChange(var Msg: TMessage); dynamic;
     public
       { Public declarations }
     end;

    var
     Form1: TForm1;

    const
     GUID_DEVINTERFACE_USB_DEVICE: TGUID = '{A5DCBF10-6530-11D2-901F-00C04FB951ED}';
     DBT_DEVICEARRIVAL           = $8000;          // system detected a new device
     DBT_DEVICEQUERYREMOVE       = $8001;          // wants to remove, may fail
     DBT_DEVICEQUERYREMOVEFAILED = $8002;          // removal aborted
     DBT_DEVICEREMOVEPENDING     = $8003;          // about to remove, still avail.
     DBT_DEVICEREMOVECOMPLETE    = $8004;          // device is gone
     DBT_DEVTYP_DEVICEINTERFACE  = $00000005;      // device interface class

    implementation

    {$R *.dfm}

    procedure TForm1.WndProc(var Msg: TMessage);
    begin
     if (Msg.Msg = WM_DEVICECHANGE) then
     begin
       try
        WMDeviceChange(Msg);
       except
        Application.HandleException(Self);
       end;
     end
     else
       Msg.Result := DefWindowProc(FWindowHandle, Msg.Msg, Msg.wParam, Msg.lParam);
    end;

    procedure TForm1.WMDeviceChange(var Msg: TMessage);
    var
     devType: Integer;
     Datos: PDevBroadcastHdr;
    begin
    if (Msg.wParam = DBT_DEVICEARRIVAL) or (Msg.wParam = DBT_DEVICEREMOVECOMPLETE) or (Msg.wParam = DBT_DEVICEQUERYREMOVE) then
    begin
      Datos := PDevBroadcastHdr(Msg.lParam);
      devType := Datos^.dbch_devicetype;
      if devType = DBT_DEVTYP_DEVICEINTERFACE then // USB Device
      begin
        if Msg.wParam = DBT_DEVICEARRIVAL then
        begin
          // подключение
        end
        else
        if Msg.wParam = DBT_DEVICEQUERYREMOVE then
        begin
          // запрос на отключение
        end;
        else
        if Msg.wParam = DBT_DEVICEREMOVECOMPLETE then
        begin
          // отключение
        end;
      end;
    end;
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
     inherited;
     FWindowHandle := AllocateHWnd(WndProc);
     USBRegister;
    end;

    function TForm1.USBRegister: Boolean;
    var
     dbi: DEV_BROADCAST_DEVICEINTERFACE;
     Size: Integer;
     r: Pointer;
    begin
     Result := False;
     Size := SizeOf(DEV_BROADCAST_DEVICEINTERFACE);
     ZeroMemory(@dbi, Size);
     dbi.dbcc_size := Size;
     dbi.dbcc_devicetype := DBT_DEVTYP_DEVICEINTERFACE;
     dbi.dbcc_reserved := 0;
     dbi.dbcc_classguid  := GUID_DEVINTERFACE_USB_DEVICE;
     dbi.dbcc_name := 0;

     r := RegisterDeviceNotification(FWindowHandle, @dbi, DEVICE_NOTIFY_WINDOW_HANDLE);
     if Assigned(r) then
       Result := True;
    end;

    procedure TForm1.FormDestroy(Sender: TObject);
    begin
     DeallocateHWnd(FWindowHandle);
    end;

    end.




    Смотрю в сторону SetupAPI, только как прикрутить не знаю.
  • kilkennycat © (06.10.17 22:13) [1]
  • MOM (13.10.17 16:13) [2]
    все оказалось на много проще, если интересно пишите
  • Smile © (13.10.17 17:53) [3]
    > все оказалось на много проще, если интересно пишите

    Кому могут быть интересны чужие проблемы? :)
 
Конференция "WinAPI" » Получение "ИД оборудования" после подключения/отключения USB [D7, WinXP]
Есть новые Нет новых   [134427   +34][b:0][p:0.002]