USB hid 设备 insert/removal 检测 winapi
Usb hid device insert/removal detection winapi
我创建了 winapi 应用程序 通过 createprocess 使用其他 .exe 到 get/set 报告。现在,当应用程序为 运行 时,我需要某种方法来检测此 USB HID 设备是来自计算机的 plugged/unplugged。最难的部分是,在该应用程序中,我只知道 VID 和 PID,而我没有该 USB HID 设备的任何句柄。有什么方法可以解决这个问题,或者我首先需要设备的句柄?
编辑
如果有人对我为什么需要它感兴趣。我想在插拔设备时 disable/enable 控制我的应用程序。
Windows 向所有 top-level windows 发送 WM_DEVICECHANGE message when new devices or media becomes availables. Checks for the event DBT_DEVICEARRIVAL in wParam
. With the event DBT_DEVICEARRIVAL
lParam can be converted to a DEV_BROADCAST_HDR 结构。
完成后,您从 DEV_BROADCAST_HDR
检查 dbch_devicetype
,如果 dbch_devicetype
等于 DBT_DEVTYP_HANDLE
或 [=],则再次将 lParam
转换为 DEV_BROADCAST_HANDLE, or DEV_BROADCAST_VOLUME 17=], 记不清是哪一个了
首先你必须注册自己的window接收WM_DEVICECHANGE
message with DBT_DEVICEARRIVAL
and DBT_DEVICEREMOVECOMPLETE
for GUID_DEVINTERFACE_USB_DEVICE
with 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;
并在销毁时取消注册:
case WM_DESTROY:
if (_Handle) UnregisterDeviceNotification(_Handle);
break;
之后您将收到通知。如果
I know just VID and PID
您可以在 dbcc_name
中搜索 L"#VID_????&PID_????#"
(在什么位置?您的实际 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;
我创建了 winapi 应用程序 通过 createprocess 使用其他 .exe 到 get/set 报告。现在,当应用程序为 运行 时,我需要某种方法来检测此 USB HID 设备是来自计算机的 plugged/unplugged。最难的部分是,在该应用程序中,我只知道 VID 和 PID,而我没有该 USB HID 设备的任何句柄。有什么方法可以解决这个问题,或者我首先需要设备的句柄?
编辑
如果有人对我为什么需要它感兴趣。我想在插拔设备时 disable/enable 控制我的应用程序。
Windows 向所有 top-level windows 发送 WM_DEVICECHANGE message when new devices or media becomes availables. Checks for the event DBT_DEVICEARRIVAL in wParam
. With the event DBT_DEVICEARRIVAL
lParam can be converted to a DEV_BROADCAST_HDR 结构。
完成后,您从 DEV_BROADCAST_HDR
检查 dbch_devicetype
,如果 dbch_devicetype
等于 DBT_DEVTYP_HANDLE
或 [=],则再次将 lParam
转换为 DEV_BROADCAST_HANDLE, or DEV_BROADCAST_VOLUME 17=], 记不清是哪一个了
首先你必须注册自己的window接收WM_DEVICECHANGE
message with DBT_DEVICEARRIVAL
and DBT_DEVICEREMOVECOMPLETE
for GUID_DEVINTERFACE_USB_DEVICE
with 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;
并在销毁时取消注册:
case WM_DESTROY:
if (_Handle) UnregisterDeviceNotification(_Handle);
break;
之后您将收到通知。如果
I know just VID and PID
您可以在 dbcc_name
中搜索 L"#VID_????&PID_????#"
(在什么位置?您的实际 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;