检测USB插入拨出[转]

原创 2007年10月08日 08:37:00
unit U_Usb;

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: array [0..255] of char;
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

TComponentUSB = class(TComponent)
private
FWindowHandle: HWND;
FOnUSBArrival: TNotifyEvent;
FOnUSBRemove: TNotifyEvent;
fDeviceName:String;
procedure WndProc(var Msg: TMessage);
function USBRegister: Boolean;
protected
procedure WMDeviceChange(var Msg: TMessage); dynamic;
public
property DeviceName:String read FDeviceName;
constructor create(AOwner: TComponent); override;
destructor Destroy; override;
published
property OnUSBArrival: TNotifyEvent read FOnUSBArrival write
FOnUSBArrival;
property OnUSBRemove: TNotifyEvent read FOnUSBRemove write FOnUSBRemove;
end;
procedure Register;
implementation

procedure Register; { add this in the implementation section }
begin
RegisterComponents('Samples', [TComponentUSB]);
end;

constructor TComponentUSB.create(AOwner: TComponent);
begin
inherited create(AOwner);
FWindowHandle := AllocateHWnd(WndProc);
USBRegister;
end;

destructor TComponentUSB.Destroy;
begin
DeallocateHWnd(FWindowHandle);
inherited Destroy;
end;

procedure TComponentUSB.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 TComponentUSB.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;

function TComponentUSB.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 := dbi.dbcc_name;
fDeviceName := String(dbi.dbcc_name);
r := RegisterDeviceNotification(FWindowHandle, @dbi,
DEVICE_NOTIFY_WINDOW_HANDLE
);
if Assigned(r) then Result := True;
end;

end.

在D2006可以生成控件.

D2006例子:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,U_Usb, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Formcreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
usb:TComponentUSB;
procedure 插入(Sender: TObject);
procedure 拨出(Sender: TObject);

{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.插入(Sender: TObject);
begin
ShowMessage('USB插入');
end;

procedure TForm1.拨出(Sender: TObject);
begin
ShowMessage('USB插入');
end;

procedure TForm1.Formcreate(Sender: TObject);
begin
usb:=TComponentUSB.create(self);
usb.OnUSBArrival := 插入;
usb.OnUSBRemove := 拨出;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeAndNil(usb);
end;

end. 

USB转串口突然拔出检测解决方案

最近做虚拟串口通讯程序(IRDA-USB-串口),由于是USB设备所以在通讯过程中有可能把串口拔出,程序需要实时检测到串口拔出。并把正在执行的任务结束关闭串口,给出提示。由于程序是C#做的,C#在操作...
  • ZOU_SEAFARER
  • ZOU_SEAFARER
  • 2009年03月24日 23:10
  • 4111

android监听usb的插入与拔出

usb的插入与拔出的监听,系统已经为我们提供了接口。 USB设备插入系统检测到ACTION_USB_DEVICE_ATTACHED USB设备拔出系统检测到ACTION_USB_DEVICE_DETA...
  • zhizhuodewo6
  • zhizhuodewo6
  • 2017年07月11日 15:02
  • 860

USB的插入检测机制

      自USB集线器的每个下游端口的D+和D-上,分别接了一个15KOm的下拉电阻到地。这样,当没有设备插入时,端口被拉低。而设备端的D+或D-会接一个15KOm上拉电阻,接到3.3V电源。其中...
  • bengold1979
  • bengold1979
  • 2010年03月05日 10:04
  • 4082

USB学习系列之二——USB设备的插入检测机制

1.USB的插入检测机制:USB端口的D+和D-均用一个15k的电阻接地,当无设备接入时,均处于低电平;在设备端在D+(表示高速设备或者全速设备)或者D-(表示低速设备)接了一个1.5k的上拉电阻到+...
  • yxfabcdefg
  • yxfabcdefg
  • 2016年09月19日 19:13
  • 1123

两种检测USB设备插入和移除的方法(Ver 2)

说明:这篇文章是第二个版本。最初版本发布于http://blog.csdn.net/jingzhongrong/archive/2007/01/02/1472440.aspx两种自动检测USB设备的添...
  • jingzhongrong
  • jingzhongrong
  • 2007年09月29日 00:18
  • 7496

检测USB设备的插入和拔出

1.需求 需要一个DLL,它可以自动检测USB设备插入和拔出,并以回调函数的方法告诉调用DLL的应用程序。   2.预研 2.1参考文档 (1)关于“Registering for Devi...
  • buyicn
  • buyicn
  • 2015年06月21日 23:48
  • 4746

USB入门系列之五 —— USB设备的插入检测机制[图]

USB主机是如何检测到设备的插入的呢?首先,在USB集线器的每个下游端口的D+和D-上,分别接了一个15K欧姆的下拉电阻到地。这样,在集线器的端口悬空时,就被这两个下拉电阻拉到了低电平。而在USB设备...
  • mikechen_2009
  • mikechen_2009
  • 2013年09月10日 09:06
  • 1241

PyQt4实现USB设备插入到弹出的检测(Windows)

直没怎么看过 QextSerialPort 中windows下枚举串口的具体实现(原因?对win32api不了解,看不懂啊_) 经过一段时间的学习,对QextSerialPort总算理清了一些,于是...
  • swqqcs
  • swqqcs
  • 2012年02月11日 17:53
  • 2672

vc检测USB设备插入或移除

1.添加消息映射 消息映射 BEGIN_MESSAGE_MAP(CONSTNETCNDlg, CDialog) //{{AFX_MSG_MAP(CONSTNETCNDlg) ON_WM_P...
  • embededvc
  • embededvc
  • 2011年11月26日 22:00
  • 6851

USB主机是如何检测到设备的插入的呢?

首先,在USB集线器的每个下游端口的D+和D-上,   分别接了一个15K欧姆的下拉电阻到地。这样,在集线器的端口悬空时,就被这两个下拉电阻拉到了低电平。而在USB设备端,在D+或者D-上接了1.5...
  • wtbcx2012
  • wtbcx2012
  • 2015年01月21日 22:20
  • 3112
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章: 检测USB插入拨出[转]
举报原因:
原因补充:

(最多只允许输入30个字)