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_????#"(在什么位置?您的实际 vidpid 值)

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;