我创建了winapi应用程序,通过createprocess使用其他.exe来获取/设置报告。现在我需要某种方法来检测应用程序运行时这个USB HID设备是否已从计算机插入/拔出。最难的部分是在那个应用程序中我只知道VID和PID,而且我没有任何USB HID设备的句柄。有没有办法解决这个问题,或者我首先需要处理设备?
修改
如果有人有兴趣我为什么需要它。我想在插拔设备时禁用/启用我的应用程序的控件。
答案 0 :(得分:3)
当新设备或媒体可用时,Windows会向所有顶级窗口发送WM_DEVICECHANGE消息。检查wParam
中的活动DBT_DEVICEARRIVAL。事件DBT_DEVICEARRIVAL
lParam可以转换为DEV_BROADCAST_HDR 结构。
完成后,您检查dbch_devicetype
中的DEV_BROADCAST_HDR
,然后将lParam
再次转换为DEV_BROADCAST_HANDLE,或dbch_devicetype
如果DBT_DEVTYP_HANDLE
等于{{} {1}}或DEV_BROADCAST_VOLUME
,我不确定记得哪一个。
答案 1 :(得分:2)
首先,您必须注册自己的窗口,以便WM_DEVICECHANGE
收到DBT_DEVICEARRIVAL
,DBT_DEVICEREMOVECOMPLETE
GUID_DEVINTERFACE_USB_DEVICE
收到RegisterDeviceNotification
- 如果没有注册,Windows将不会发送此通知!
case WM_CREATE:
DEV_BROADCAST_DEVICEINTERFACE NotificationFilter = {
sizeof(DEV_BROADCAST_DEVICEINTERFACE),
DBT_DEVTYP_DEVICEINTERFACE,
0,
GUID_DEVINTERFACE_USB_DEVICE
};
if (!(_Handle = RegisterDeviceNotification(hwnd, &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE)))
{
return -1;
}
break;
并取消注册destroy:
case WM_DESTROY:
if (_Handle) UnregisterDeviceNotification(_Handle);
break;
之后,您将收到通知。如果
我只知道VID和PID
您可以在L"#VID_????&PID_????#"
中搜索dbcc_name
(在哪里?您的实际vid
和pid
值
case WM_DEVICECHANGE:
switch (wParam)
{
case DBT_DEVICEREMOVECOMPLETE:
case DBT_DEVICEARRIVAL:
{
PDEV_BROADCAST_DEVICEINTERFACE p = (PDEV_BROADCAST_DEVICEINTERFACE)lParam;
if (p->dbcc_devicetype == DBT_DEVTYP_DEVICEINTERFACE &&
p->dbcc_classguid == GUID_DEVINTERFACE_USB_DEVICE)
{
DbgPrint("%S\n", p->dbcc_name);
if (wcsstr(p->dbcc_name, L"#VID_****&PID_****#"))
{
DbgPrint("%s\n", wParam == DBT_DEVICEARRIVAL ? "arrival" : "removal");
}
}
}
break;
}
break;