您的位置:首页 > 其它

Detect USB Device Insert and Removal

2013-05-31 23:12 435 查看
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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: