zoukankan      html  css  js  c++  java
  • Detect USB Device Insert and Removal

    http://www.delphibasics.info/home/delphibasicssnippets/detectusbdeviceinsertandremoval-uusbbytestest

    unit uUsb;
    //Author: testest
    interface
    
    uses Windows, Messages, Classes;
    
    type
      PDevBroadcastHdr  = ^DEV_BROADCAST_HDR;
      DEV_BROADCAST_HDR = packed record
        dbch_size: DWORD;
        dbch_devicetype: DWORD;
        dbch_reserved: DWORD;
      end;
      TDevBroadcastHdr = DEV_BROADCAST_HDR;
    
    type
      PDevBroadcastDeviceInterface  = ^DEV_BROADCAST_DEVICEINTERFACE;
      DEV_BROADCAST_DEVICEINTERFACE = record
        dbcc_size: DWORD;
        dbcc_devicetype: DWORD;
        dbcc_reserved: DWORD;
        dbcc_classguid: TGUID;
        dbcc_name: Char;
      end;
      TDevBroadcastDeviceInterface = DEV_BROADCAST_DEVICEINTERFACE;
    
    const
      GUID_DEVINTERFACE_USB_DEVICE: TGUID = '{A5DCBF10-6530-11D2-901F-00C04FB951ED}';
      DBT_DEVICEARRIVAL          = $8000;
      DBT_DEVICEREMOVECOMPLETE   = $8004;
      DBT_DEVTYP_DEVICEINTERFACE = $00000005;
    
    type
      TUsbNotifyProc = procedure(Sender: TObject; const DeviceName: String) of Object;
      TUsbNotifier = class
      private
        FWindowHandle: HWND;
        FNotificationHandle: Pointer;
        FOnUsbArrival: TUsbNotifyProc;
        FOnUsbRemoval: TUsbNotifyProc;
        procedure WndProc(var Msg: TMessage);
      public
        constructor Create;
        property OnUsbArrival: TUsbNotifyProc read FOnUsbArrival write FOnUsbArrival;
        property OnUsbRemoval: TUsbNotifyProc read FOnUsbRemoval write FOnUsbRemoval;
        destructor Destroy; override;
      end;
    
    
    implementation
    
    constructor TUsbNotifier.Create;
    var
      Size: Cardinal;
      Dbi: TDevBroadcastDeviceInterface;
    begin
      inherited;
      FWindowHandle := AllocateHWnd(WndProc);
    
      Size := SizeOf(Dbi);
      ZeroMemory(@Dbi, Size);
    
      Dbi.dbcc_size := Size;
      Dbi.dbcc_devicetype := DBT_DEVTYP_DEVICEINTERFACE;
      Dbi.dbcc_classguid := GUID_DEVINTERFACE_USB_DEVICE;
    
      FNotificationHandle := RegisterDeviceNotification(FWindowHandle, @Dbi,
                                                  DEVICE_NOTIFY_WINDOW_HANDLE);
    end;
    
    procedure TUsbNotifier.WndProc(var Msg: TMessage);
    var
      Dbi: PDevBroadcastDeviceInterface;
    begin
      with Msg do
      if (Msg = WM_DEVICECHANGE)
          and ((WParam = DBT_DEVICEARRIVAL)
            or (WParam = DBT_DEVICEREMOVECOMPLETE)) then
      try
        Dbi := PDevBroadcastDeviceInterface(LParam);
        if Dbi.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE then
        begin
          if WParam = DBT_DEVICEARRIVAL then
          begin
            if Assigned(FOnUsbArrival) then
              FOnUsbArrival(Self, PChar(@Dbi.dbcc_name));
          end
          else
          begin
            if Assigned(FOnUsbRemoval) then
              FOnUsbRemoval(Self, PChar(@Dbi.dbcc_name));
          end;
        end;
      except
        Result := DefWindowProc(FWindowHandle, Msg, WParam, LParam);
      end
      else
        Result := DefWindowProc(FWindowHandle, Msg, WParam, LParam);
    end;
    
    destructor TUsbNotifier.Destroy;
    begin
      UnregisterDeviceNotification(FNotificationHandle);
      DeallocateHWnd(FWindowHandle);
      inherited;
    end;
    
    end.

  • 相关阅读:
    跟踪spring MVC的请求
    spring的Java注解方式
    spring IOC理解
    spring aop
    spring mvc开发过程中的乱码问题
    springmvc的Controller里实现转发的同时弹出提示对话框
    C++程序加速的12个方法
    VSCode官方配置C/C++
    VSCode配置C/C++环境
    Numba 0.44 中文文档
  • 原文地址:https://www.cnblogs.com/shangdawei/p/3111629.html
Copyright © 2011-2022 走看看