救命啊,还是BCB下的USB连接设备识别问题
上次蒙几位大侠指导,写出下面程序.
#include <vcl.h>
#pragma hdrstop
#include <dbt>
#include "USBMsg_t.h"
#include "usbdi.h"
#include "devioctl.h"
#include <initguid.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
DEFINE_GUID(GUID_DEVINTERFACE_USB_DEVICE, 0xA5DCBF10L, 0x6530, 0x11D2,
0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
SetUSBNotify(NULL);
Application->HookMainWindow(AppHookFunc);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SetUSBNotify(TObject *Sender)
{
DEV_BROADCAST_DEVICEINTERFACE DevInt;
memset(&DevInt,0,sizeof(DEV_BROADCAST_DEVICEINTERFACE));
DevInt.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
DevInt.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
DevInt.dbcc_classguid = GUID_DEVINTERFACE_USB_DEVICE; //设备的 GUID, 不同的设备有不同的 GUID,根据实际情况设定
m_DevNotify = RegisterDeviceNotification(Application->Handle, &DevInt,
DEVICE_NOTIFY_WINDOW_HANDLE);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
UnregisterDeviceNotification(m_DevNotify);
Application->UnhookMainWindow(AppHookFunc);
}
//---------------------------------------------------------------------------
bool __fastcall TForm1::AppHookFunc(TMessage &Message)
{
bool handled = false;
int i;
switch(Message.Msg){
case WM_DEVICECHANGE:
switch(Message.WParam){
case DBT_DEVICEREMOVECOMPLETE:
if(IsOurUSBDevice(Message.LParam))
{
// pStatBar->Text = "请检查USB连线是否断开...";
i=1;
handled = true;
}
break;
case DBT_DEVICEARRIVAL:
if(IsOurUSBDevice(Message.LParam))
{
// pStatBar->Text = "USB设备接通";
i=2;
handled = true;
}
break;
default:
break;
}
break;
default:
break;
}
return handled;
}
bool __fastcall TForm1::IsOurUSBDevice(int iMsgLParam)
{
bool bRes = false;
DEV_BROADCAST_HDR *lpDevHdr = (DEV_BROADCAST_HDR*)iMsgLParam;
if(lpDevHdr->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE)
{
DEV_BROADCAST_DEVICEINTERFACE *lpb =
(DEV_BROADCAST_DEVICEINTERFACE *)iMsgLParam;
if(lpb->dbcc_classguid == GUID_DEVINTERFACE_USB_DEVICE) // check GUID to determine if that's our USB device
{
bRes = true;
}
}
return (bRes);
}
现在可以识别USB插拔时的DBT_DEVICEREMOVECOMPLETE和DBT_DEVICEARRIVAL.
可是发现插拔我们的USB采集设备和插拔一般USB鼠标,甚至U盘时收到的消息差不多,无法区分.
下面是用spy++抓到的消息:
<00001> 00140368 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00002> 00140368 S WM_DEVICECHANGE Event:DBT_DEVICEARRIVAL dwData:0015EA70
<00003> 00140368 R WM_DEVICECHANGE fComplete:False
<00004> 00140368 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00005> 00140368 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00006> 00140368 S WM_DEVICECHANGE Event:DBT_DEVICEREMOVECOMPLETE dwData:0015EA70
<00007> 00140368 R WM_DEVICECHANGE fComplete:False
<00008> 00140368 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00009> 00140368 S WM_DEVICECHANGE Event:DBT_DEVICEARRIVAL dwData:0015EA70
<00010> 00140368 R WM_DEVICECHANGE fComplete:False
<00011> 00140368 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00012> 00140368 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00013> 00140368 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00014> 00140368 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00015> 00140368 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00016> 00140368 S WM_DEVICECHANGE Event:DBT_DEVICEREMOVECOMPLETE dwData:0015EA70
<00017> 00140368 R WM_DEVICECHANGE fComplete:False
1-7为我们的USB设备插拔时的消息, 8-17为另一USB鼠标插拔时产生的消息.
单步跟踪发现lpb->dbcc_classguid值完全一样.
不知道错在哪里?