Я пытаюсь определить, когда моя клавиатура подключена или отключена. Я попробовал следующие стратегии:
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
), контроллер перечисляется только тогда, когда он подключен, что позволяет мне определять его состояние соединения.
Другие функции
Я пробовал:
IDirectInput8::GetDeviceStatus
IDirectInputDevice8::GetCapabilities
IDirectInputDevice8::GetDeviceInfo
IDirectInputDevice8::GetDeviceState
IDirectInputDevice8::Poll
Все функции выполняются успешно и не позволяют понять, подключена ли клавиатура.
Я также просмотрел секцию клавиатуры в MSDN , но безрезультатно.
Вопросы
- Может ли кто-нибудь, кто сделал это успешно, подтвердить, что я выбрал правильный подход?
- Есть ли другая функция или API, которые я пропускаю?
- Какие-либо сайты, которые приводят пример (я безуспешно гуглил)?
- Почему
EnumDevices
работает правильно для моего контроллера, но не для моей клавиатуры? И как мне заставить его работать на моей клавиатуре?