• USB Device arrival or remove ( delphi )


    
    
    unit USBDeviceNotify;
    //USB Device arrival or remove
    interface
    
    uses
      Windows, Messages, SysUtils, Classes, Forms;
    
    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;
    
    const
      GUID_DEVINTERFACE_USB_DEVICE: TGUID = '{A5DCBF10-6530-11D2-901F-00C04FB951ED}';
      DBT_DEVICEARRIVAL                   = $8000;                     //   system   detected   a   new   device
      DBT_DEVICEREMOVECOMPLETE            = $8004;                     //   device   is   gone
      DBT_DEVTYP_DEVICEINTERFACE          = $00000005;                 //   device   interface   class
    
    type
      TUSBDeviceEvent = procedure(Sender: TObject; pDeviceData: PDevBroadcastDeviceInterface) of object;
    
      TUSBDeviceNotify = class(TComponent)
      private
        FWindowHandle: HWND;
        FOnUSBArrival: TUSBDeviceEvent;
        FOnUSBRemove:  TUSBDeviceEvent;
        procedure WndProc(var Msg: TMessage);
        function USBRegister: Boolean;
      protected
        procedure WMDeviceChange(var Msg: TMessage); dynamic;
      public
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
      published
        property OnUSBArrival: TUSBDeviceEvent read FOnUSBArrival write FOnUSBArrival;
        property OnUSBRemove:  TUSBDeviceEvent read FOnUSBRemove  write FOnUSBRemove;
      end;
    
    implementation
    
    constructor TUSBDeviceNotify.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      FWindowHandle := AllocateHWnd(WndProc);
      USBRegister;
    end;
    
    destructor TUSBDeviceNotify.Destroy;
    begin
      DeallocateHWnd(FWindowHandle);
      inherited Destroy;
    end;
    
    procedure TUSBDeviceNotify.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 TUSBDeviceNotify.WMDeviceChange(var Msg: TMessage);
    var
      devType: Integer;
      Datos:   PDevBroadcastHdr;
      pData:   PDevBroadcastDeviceInterface;
    begin
      if (Msg.wParam = DBT_DEVICEARRIVAL) or (Msg.wParam = DBT_DEVICEREMOVECOMPLETE) then
      begin
        Datos := PDevBroadcastHdr(Msg.lParam);
        devType := Datos^.dbch_devicetype;
        if devType = DBT_DEVTYP_DEVICEINTERFACE then
        begin   //   USB   Device
          pData := PDevBroadcastDeviceInterface(Msg.LParam);
          if Msg.wParam = DBT_DEVICEARRIVAL then
          begin
            if Assigned(FOnUSBArrival) then
              FOnUSBArrival(Self, pData);
          end
          else
          begin
            if Assigned(FOnUSBRemove) then
              FOnUSBRemove(Self, pData);
          end;
        end;
      end;
    end;
    
    function TUSBDeviceNotify.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;
    
    end.
     

  • 相关阅读:
    ccBPM典型的树形表单和多表头表单的流程示例
    Arrays -数组工具类,数组转化字符串,数组排序等
    String
    ArrayList
    Random
    Scanner
    Phone-java标准类
    HelloWorld-java
    c++ 由无向图构造邻接表,实现深度优先遍历、广度优先遍历。
    c++实现哈夫曼树,哈夫曼编码,哈夫曼解码(字符串去重,并统计频率)
  • 原文地址:https://www.cnblogs.com/shangdawei/p/3049784.html
Copyright © 2020-2023  润新知