Win32 определяет, когда клавиатура подключена / отключена - PullRequest
5 голосов
/ 29 марта 2012

Я пытаюсь определить, когда моя клавиатура подключена или отключена. Я попробовал следующие стратегии:

RegisterDeviceNotification

Использование RegisterDeviceNotifaction, как описано в MSDN было предложено в , как определить, что клавиатура отключена в DirectInput . Когда я попробовал это, я получаю событие DB_DEVNODES_CHANGED в обратном вызове окна, которое не предоставляет никакой другой информации (просто какое-то неизвестное устройство изменило состояние соединения). Я пробовал различные GUID для регистрации: 4D36E96B-E325-11CE-BFC1-08002BE10318 (на нескольких веб-сайтах указывалось, что это указатель класса для клавиатур) и guidInstance, полученный из IDirectInput8::EnumDevices(DI8DEVCLASS_KEYBOARD, ..., DIEDFL_ATTACHEDONLY). Но я все еще получаю только DB_DEVNODES_CHANGED событие.

IDirectInput8 :: EnumDevices

Каждый вызов IDirectInput8::EnumDevices(DI8DEVCLASS_KEYBOARD, ..., DIEDFL_ATTACHEDONLY) должен перечислять только подключенные устройства. Однако, когда я отсоединяю свою клавиатуру, она все равно перечисляется EnumDevices. Когда я делаю то же самое для моего игрового контроллера (с типом DI8DEVCLASS_GAMECTRL), контроллер перечисляется только тогда, когда он подключен, что позволяет мне определять его состояние соединения.

Другие функции

Я пробовал:

  1. IDirectInput8::GetDeviceStatus
  2. IDirectInputDevice8::GetCapabilities
  3. IDirectInputDevice8::GetDeviceInfo
  4. IDirectInputDevice8::GetDeviceState
  5. IDirectInputDevice8::Poll

Все функции выполняются успешно и не позволяют понять, подключена ли клавиатура.

Я также просмотрел секцию клавиатуры в MSDN , но безрезультатно.

Вопросы

  1. Может ли кто-нибудь, кто сделал это успешно, подтвердить, что я выбрал правильный подход?
  2. Есть ли другая функция или API, которые я пропускаю?
  3. Какие-либо сайты, которые приводят пример (я безуспешно гуглил)?
  4. Почему EnumDevices работает правильно для моего контроллера, но не для моей клавиатуры? И как мне заставить его работать на моей клавиатуре?

1 Ответ

3 голосов
/ 29 марта 2012

Рассматривали ли вы GetRawInputDeviceList() и GetRawInputDeviceInfo(), используя RID_DEVICE_INFO для pData и проверяя его dwType?

Это даст вам начальное состояние, тогда, если ваш wndProc обрабатывает WM_INPUT_DEVICE_CHANGE, вы можете использовать параметры для обнаружениядобавьте / удалите, и lParam можно отправить прямо на GetRawInputDeviceInfo().

За комментарии: WM_INPUT_DEVICE_CHANGE будет поступать только для приложений, которые вызвали RegisterRawInputDevices() и специально запросили это уведомление.

...