zoukankan      html  css  js  c++  java
  • 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.
     

  • 相关阅读:
    关于C51的中断函数要注意的几个问题
    WORD文档中插入页码的问题
    【转载】vim复制时的缩进
    【转载】在Linux下,一个文件也有三种时间,分别是:访问时间、修改时间、状态改动时间
    【转载】LINUX上MYSQL优化三板斧
    【转载】小结一下linux 2.6内核的四种IO调度算法
    【转载】linux挂载mount参数优化
    【转载】ipcs与Linux共享内存
    【转载】Linux下的IO监控与分析
    【转载】netstat--查看服务器[有效]连接数--统计端口并发数--access.log分析
  • 原文地址:https://www.cnblogs.com/shangdawei/p/3049784.html
Copyright © 2011-2022 走看看