我写了个程序,已经能跟USB正常通讯上了,但这个USB设备被拔除时,我程序怎么知道被拔下来的USB设备是我程序里面已经打开的那个呢?我现在用的方法是监听 WM_DEVICECHANGE消息,然后当wParam==DBT_DEVICEREMOVECOMPLETE 时就是设备移除,lParam 是一个PDEV_BROADCAST_DEVICEINTERFACE 类型的指针
lParam ->dbcc_name 就是拔下的设备的路径名,然后比较两个路径名(跟已经打开的设备比较)就知道是不是已经打开的设备,但为什么我拔下已经打开的设备结果两个路径名还是不一样呢?
调试发现两个路径名分别如下
从lParam 解析出来的 {"\\?\HID#Vid_040b&Pid_201b&MI_01&Col05#7&fec02ab&0&0004#{4d1e55b2-f16f-11cf-88cb-001111000030}"}
我原来枚举出来并正常通讯的 {"\\?\hid#vid_040b&pid_201b&mi_01&col01#7&fec02ab&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"}是不是这种方法不行啊??大家一般用什么方法?急啊
lParam ->dbcc_name 就是拔下的设备的路径名,然后比较两个路径名(跟已经打开的设备比较)就知道是不是已经打开的设备,但为什么我拔下已经打开的设备结果两个路径名还是不一样呢?
调试发现两个路径名分别如下
从lParam 解析出来的 {"\\?\HID#Vid_040b&Pid_201b&MI_01&Col05#7&fec02ab&0&0004#{4d1e55b2-f16f-11cf-88cb-001111000030}"}
我原来枚举出来并正常通讯的 {"\\?\hid#vid_040b&pid_201b&mi_01&col01#7&fec02ab&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"}是不是这种方法不行啊??大家一般用什么方法?急啊
解决方案 »
- VC 6.0安装SDK问题
- 有哪位筒子可以帮个忙,发个VC下面ADO编程的电子书啊什么的啊
- 如何动态调整PICTUER控件的大小
- 几个一样的窗口,怎么判断那个是最后一个启动的
- 怎么在多文档程序中执行命令行参数?
- 在线等,只有高手才能解决:DLL注册问题?
- 如何在 tWebBrowser中模拟选中一个区域, 这个区域的起点和终点已知
- 程序异常退出时如何释放内存影射文件和信标资源!
- ATL接口中怎么才能传入一个自定义的结构,不想用BYTE*,那个达人知道???
- 请问哪里有rational purify下载,找死我了。。。
- 如何通过全局鼠标钩子获取其他窗口选中文本内容
- 请教使用VC设计试卷自动生成系统的思路?
自定义HID设备耶~~不是U盘耶也可以这样做??
看下这个.....
我已经做了.....WM_DEVICECHANGE 带过来那两参数也不是0了我上面也说了
GUID InterfaceClassGuid = {0x53f56307,0xb6bf,0x11d0,0x94,0xf2,0x00,0xa0,0xc9,0x1e,0xfb,0x8b};我的设备GUID
DEV_BROADCAST_DEVICEINTERFACE NotificationFilter; ZeroMemory( &NotificationFilter, sizeof(NotificationFilter) );
NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
NotificationFilter.dbcc_classguid = InterfaceClassGuid;
HDEVNOTIFY hDeviceNotify = RegisterDeviceNotification(
this->m_hWnd, // events recipient
&NotificationFilter, // type of device
DEVICE_NOTIFY_WINDOW_HANDLE // type of recipient handle
);
if(NULL == hDeviceNotify )
{
AfxMessageBox(TEXT("RegisterDeviceNotification"));
return FALSE;
}
case DBT_DEVICEREMOVECOMPLETE:
switch(pDev_Hdr->dbch_devicetype)
{
case(DBT_DEVTYP_DEVICEINTERFACE):
PDEV_BROADCAST_DEVICEINTERFACE pDev_Vol = (PDEV_BROADCAST_DEVICEINTERFACE)pDev_Hdr; AfxMessageBox(_T("test"));
AfxMessageBox(pDev_Vol->dbcc_name);
break;
}
DEV_BROADCAST_DEVICEINTERFACE DevBroadcastDeviceInterface;
GUID HidGuid; ZeroMemory( &DevBroadcastDeviceInterface, sizeof(DevBroadcastDeviceInterface) );
//获取HID设备的接口类GUDI
HidD_GetHidGuid(&HidGuid);
//设置DevBroadcastDeviceInterface结构体,用来注册设备改变时的通知
DevBroadcastDeviceInterface.dbcc_size=sizeof(DEV_BROADCAST_DEVICEINTERFACE);
DevBroadcastDeviceInterface.dbcc_devicetype=DBT_DEVTYP_DEVICEINTERFACE;
DevBroadcastDeviceInterface.dbcc_classguid=HidGuid;
//注册设备改变时收到通知
RegisterDeviceNotification(m_hWn,
&DevBroadcastDeviceInterface,
DEVICE_NOTIFY_WINDOW_HANDLE);
case DBT_DEVICEREMOVECOMPLETE:
if(pdbi->dbcc_devicetype==DBT_DEVTYP_DEVICEINTERFACE)
{
byDevPathName=pdbi->dbcc_name; //保存发生状态改变的设备的路径名
//比较是否是我们指定的设备
if(m_DevPathName.CompareNoCase(byDevPathName)==0)
{
//设备被拔出,应该关闭设备(如果处于打开状态的话),停止操作
if(MyDevOK==TRUE)
{
MyDevOK=FALSE;
Close();
}
}
我是这样写的调试时
byDevPathName: {"\\?\HID#Vid_040b&Pid_201b&MI_01&Col05#7&fec02ab&0&0004#{4d1e55b2-f16f-11cf-88cb-001111000030}"}
m_DevPathName: {"\\?\hid#vid_040b&pid_201b&mi_01&col01#7&fec02ab&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"}不一样啊,明明是同一个设备拔下来
兔子大哥.....这样会很浪费CPU的吧.......而且如果不断地拔插不会死机?
byDevPathName: {"\\?\HID#Vid_040b&Pid_201b&MI_01&Col05#7&fec02ab&0&0004#{4d1e55b2-f16f-11cf-88cb-001111000030}"}
m_DevPathName: {"\\?\hid#vid_040b&pid_201b&mi_01&col01#7&fec02ab&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"}红色部分不一样~~嘿嘿,大哥看到了没~~谢谢~~