Win32确定何时连接/断开键盘

Run*_*olt 5 c c++ keyboard winapi device

我试图确定何时连接或断开了键盘。我尝试了以下策略:

RegisterDeviceNotification

如何确定DirectInput中键盘断开连接方面建议使用MSDN上介绍的RegisterDeviceNotifaction 。当我尝试此操作时,我在窗口回调中获取事件,该事件不提供其他信息(只是某些未知设备已更改连接状态)。我尝试了各种GUID进行注册:(几个网站说这是键盘的类guid)和从检索到的guidInstance 。但是我仍然只得到事件。DB_DEVNODES_CHANGED4D36E96B-E325-11CE-BFC1-08002BE10318IDirectInput8::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. 有没有提供示例的网站(我在Google上搜索失败)?
  4. 为什么EnumDevices对我的控制器但对我的键盘不能正常工作?以及如何使它适用于键盘?

Joe*_*Joe 3

您是否考虑过GetRawInputDeviceList()使用GetRawInputDeviceInfo()RID_DEVICE_INFO 作为 pData 并检查它的 dwType?

这将为您提供初始状态,然后如果您的 wndProc 处理 WM_INPUT_DEVICE_CHANGE 您可以使用参数来检测添加/删除,并且 lParam 可以直接发送到GetRawInputDeviceInfo().

根据评论:WM_INPUT_DEVICE_CHANGE 仅适用于已调用RegisterRawInputDevices()并专门请求此通知的应用程序。