2009-04-01 10 views
7

В настоящее время у меня есть код, который устанавливает уведомления о подключенных USB-HID-устройствах в службе Windows (написанных на C++). Код выглядит следующим образом:Использование RegisterDeviceNotification() для ВСЕХ USB-устройств

GUID hidGuid; 
    HidD_GetHidGuid(&hidGuid); 

    DEV_BROADCAST_DEVICEINTERFACE NotificationFilter; 
    ZeroMemory(&NotificationFilter, sizeof(NotificationFilter)); 
    NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE); 
    NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; 
    NotificationFilter.dbcc_classguid = hidGuid; 
    HDEVNOTIFY deviceNotify = RegisterDeviceNotification(StatusHandle, &NotificationFilter, DEVICE_NOTIFY_SERVICE_HANDLE); 

Уведомление затем поступает через событие SERVICE_CONTROL_DEVICEEVENT. (Помните, что это Сервис, поэтому нет WM_DEVICECHANGE).

Я думал, что могу просто указать флаг DEV_BROADCAST_DEVICEINTERFACE в вызове RegisterDeviceNotification(), чтобы он переопределял dbcc_classguid и получал все устройства, но оказывается, что этот флаг не поддерживается в Windows 2000, что для меня является разбойником. Кроме того, я предполагаю, что это вернет больше, чем просто USB-устройства.

Как изменить это, чтобы получить все USB-устройства, а не только USB HID? Должно ли быть так просто, как просто дать другой GUID? Есть ли GUID для всего USB?

ответ

5

использовано GUID_DEVINTERFACE_USB_DEVICE (в "usbiodef.h"), чтобы наблюдать за всеми USB-устройствами.

DEV_BROADCAST_DEVICEINTERFACE NotificationFilter; 
    ZeroMemory(&NotificationFilter, sizeof(NotificationFilter)); 

    NotificationFilter.dbcc_size = sizeof(NotificationFilter); 
    NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; 
    NotificationFilter.dbcc_reserved = 0; 

    NotificationFilter.dbcc_classguid = GUID_DEVINTERFACE_USB_DEVICE; 

    HDEVNOTIFY hDevNotify = RegisterDeviceNotification(hwnd, &NotificationFilter, DEVICE_NOTIFY_SERVICE_HANDLE); 
5

Вы пробовали GUID_DEVCLASS_USB? (определено в devguid.h, Windows SDK)

Возможно, вы имели в виду флаг DEVICE_NOTIFY_ALL_INTERFACE_CLASSES?

Кроме того, я нашел следующую статью полезной - это о GUIDs устройств против интерфейса GUIDs:

http://blogs.msdn.com/doronh/archive/2006/02/15/532679.aspx