Используйте RegisterDeviceNotification() для ВСЕХ USB-устройств

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

   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?


person Adam Haile    schedule 01.04.2009    source источник


Ответы (2)


Используется 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);
person user121584    schedule 11.06.2009

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

Вы имели в виду флаг DEVICE_NOTIFY_ALL_INTERFACE_CLASSES?

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

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

person snowcrash09    schedule 14.04.2009