Используйте RegisterDeviceNotification () для ВСЕХ USB-устройств - PullRequest
7 голосов
/ 01 апреля 2009

В настоящее время у меня есть некоторый код, который устанавливает уведомления о подключенных устройствах 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?

Ответы [ 2 ]

5 голосов
/ 12 июня 2009

Используется 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 голосов
/ 14 апреля 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...