读书人

怎么截USB申请退出时的DBT_DEVICEQUER

发布时间: 2011-12-28 22:45:21 作者: rapoo

如何截USB申请退出时的DBT_DEVICEQUERYREMOVE
我做了一个MFC的对话框程序,添加了ON_MESSAGE(WM_DEVICECHANGE,DealDeviceChange)的消息映射,在DealDeviceChange里面我只能跟踪到DBT_DEVICEARRIVAL和DBT_DEVICEREMOVECOMPLETE,后来在网上查了一些资料,说是要注册,注册以后还是不能截获DBT_DEVICEQUERYREMOVE,注册代码如下
static HDEVNOTIFY hNotifyDevNode=NULL;

if (hNotifyDevNode!=NULL)
{
UnregisterDeviceNotification(hNotifyDevNode);
}
DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
GUID WceusbshGUID = { 0x25dbce51, 0x6c8f, 0x4a72,
0x8a,0x6d,0xb5,0x4c,0x2b,0x4f,0xc8,0x35 };
ZeroMemory( &NotificationFilter, sizeof(NotificationFilter) );
NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
NotificationFilter.dbcc_classguid = WceusbshGUID;

hNotifyDevNode = RegisterDeviceNotification(
this->GetSafeHwnd(), // events recipient
&NotificationFilter, // type of device
DEVICE_NOTIFY_WINDOW_HANDLE // type of recipient handle
);

if ( NULL == hNotifyDevNode )
{
MessageBox("注册失败");
}

[解决办法]
简单的方式是在驱动响应例程里直接返回LOCK状态,告诉系统设备使用中。
在APP层恐怕要用全局Hook了。
hotplug.dll,HotPlugSafeRemovalNotification函数进行挂钩处理。
[解决办法]
现在还在弄这个吗?
你注册的方法错了而已。
我前段时间刚弄了一下这个。
http://blog.csdn.net/Sephoenix/archive/2010/04/01/5442064.aspx

读书人网 >VC/MFC

热点推荐