Unit USBUnit;
Interface
Uses
Windows, SysUtils, Classes, Messages, 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;
TUSB = Class(TObject)
private
FWindowHandle: HWND;
FOnUSBArrival: TNotifyEvent;
FOnUSBRemove: TNotifyEvent;
Procedure WndProc(Var Msg: TMessage);
Function USBRegister: Boolean;
protected
Procedure WMDeviceChange(Var Msg: TMessage); dynamic;
public
Constructor Create;
Destructor Destroy; override;
Property OnUSBArrival: TNotifyEvent read FOnUSBArrival write FOnUSBArrival;
Property OnUSBRemove: TNotifyEvent read FOnUSBRemove write FOnUSBRemove;
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
Var
USB: TUSB;
Implementation
{ TUSB }
Constructor TUSB.Create;
Begin
FWindowHandle := AllocateHWnd(WndProc);
USBRegister;
End;
Destructor TUSB.Destroy;
Begin
DeallocateHWnd(FWindowHandle);
Inherited Destroy;
End;
Function TUSB.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 TUSB.WMDeviceChange(Var Msg: TMessage);
Var
devType: Integer;
Datos: PDevBroadcastHdr;
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
If Msg.wParam = DBT_DEVICEARRIVAL Then Begin
If Assigned(FOnUSBArrival) Then
FOnUSBArrival(Self);
End
Else Begin
If Assigned(FOnUSBRemove) Then
FOnUSBRemove(Self);
End;
End;
End;
End;
Procedure TUSB.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;
Initialization
If Not Assigned(USB) Then
USB := TUSB.Create;
Finalization
FreeAndNil(USB);
End.
Interface
Uses
Windows, SysUtils, Classes, Messages, 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;
TUSB = Class(TObject)
private
FWindowHandle: HWND;
FOnUSBArrival: TNotifyEvent;
FOnUSBRemove: TNotifyEvent;
Procedure WndProc(Var Msg: TMessage);
Function USBRegister: Boolean;
protected
Procedure WMDeviceChange(Var Msg: TMessage); dynamic;
public
Constructor Create;
Destructor Destroy; override;
Property OnUSBArrival: TNotifyEvent read FOnUSBArrival write FOnUSBArrival;
Property OnUSBRemove: TNotifyEvent read FOnUSBRemove write FOnUSBRemove;
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
Var
USB: TUSB;
Implementation
{ TUSB }
Constructor TUSB.Create;
Begin
FWindowHandle := AllocateHWnd(WndProc);
USBRegister;
End;
Destructor TUSB.Destroy;
Begin
DeallocateHWnd(FWindowHandle);
Inherited Destroy;
End;
Function TUSB.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 TUSB.WMDeviceChange(Var Msg: TMessage);
Var
devType: Integer;
Datos: PDevBroadcastHdr;
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
If Msg.wParam = DBT_DEVICEARRIVAL Then Begin
If Assigned(FOnUSBArrival) Then
FOnUSBArrival(Self);
End
Else Begin
If Assigned(FOnUSBRemove) Then
FOnUSBRemove(Self);
End;
End;
End;
End;
Procedure TUSB.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;
Initialization
If Not Assigned(USB) Then
USB := TUSB.Create;
Finalization
FreeAndNil(USB);
End.
解决方案 »
- 200RMB请人写一个Delphi2010的简单Demo,有李维的Demo作为参考.
- 怎样把一个控件从一个TPanel里拖到另一个TPanel里
- 能不能给panel加个滚动条啊
- 100(3)
- 如何将数值转换成标准有一定格式的字符串???急
- 有关web service 得问题,急件!!!!!
- 关于月份的计算!多多帮忙!!
- 如何使edit重新获得焦点?
- 求答:VC++转成DELPHI??
- 在数据库编程中遇到的一个奇怪的问题?
- TIdTCPServer在OnExecute事件收到字符串,然后紧接着向TIdTCPClient发送字符串,为什么不执行?
- 三层数据库系统开发过程中的问题 。报错 新事务不能登记到指定的事务处理器中
之后在你delphi设置lib路径:tools-Environment Options-Library-Library path 加入这个文件路径
或者Component-Unit file name(Browse)加入这个文件之后声明方法
procedure OnmyUSBArrival(Sender: TObject);
begin
ShowMessage('插入了!!!');
end;procedure OnmyUSBRemove(Sender: TObject);
begin
ShowMessage('拔出了!!!');
end;var
MYUSB:TUSB;
begin
MYUSB:=TUSB.Create;
MYUSB.OnUSBRemove:=OnmyUSBRemove;
MYUSB.OnUSBArrival:=OnmyUSBArrival;
MYUSB.free;
end;当系统有usb插入的时候提示,插入了!
拔出的时候提示,拔出了!
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,USBUnit;//引用 USBUnit单元type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
procedure OnmyUSBArrival(Sender: TObject); //在这里声明
procedure OnmyUSBRemove(Sender: TObject);
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
var
MYUSB:TUSB;
begin
MYUSB:=TUSB.Create;
MYUSB.OnUSBRemove:=OnmyUSBRemove;
MYUSB.OnUSBArrival:=OnmyUSBArrival;
MYUSB.free;
end;procedure TForm1.OnmyUSBArrival(Sender: TObject);
begin
ShowMessage('插入了!!!');
end;procedure TForm1.OnmyUSBRemove(Sender: TObject);
begin
ShowMessage('拔出了!!!');
end;end.
procedure TForm1.FormCreate(Sender: TObject);
var
MYUSB:TUSB;
begin
MYUSB:=TUSB.Create;
MYUSB.OnUSBRemove:=OnmyUSBRemove;
MYUSB.OnUSBArrival:=OnmyUSBArrival;
//MYUSB.free;不要释放
end;