Usb隐藏设备插入/移除检测winapi

时间:2017-01-13 12:58:40

标签: c++ winapi usb hid

我创建了winapi应用程序,通过createprocess使用其他.exe来获取/设置报告。现在我需要某种方法来检测应用程序运行时这个USB HID设备是否已从计算机插入/拔出。最难的部分是在那个应用程序中我只知道VID和PID,而且我没有任何USB HID设备的句柄。有没有办法解决这个问题,或者我首先需要处理设备?

修改

如果有人有兴趣我为什么需要它。我想在插拔设备时禁用/启用我的应用程序的控件。

2 个答案:

答案 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_DEVICEARRIVALDBT_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(在哪里?您的实际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;