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

2023-12-04

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

注册设备通知

使用 RegisterDeviceNotification,如上所述MSDN被建议于如何在 DirectInput 中确定键盘已断开。当我尝试这个时,我得到了DB_DEVNODES_CHANGED窗口回调中的事件不提供其他信息(仅一些未知的设备已更改连接状态)。我尝试了各种 GUID 进行注册:4D36E96B-E325-11CE-BFC1-08002BE10318(几个网站说这是键盘的类 guid)以及从IDirectInput8::EnumDevices(DI8DEVCLASS_KEYBOARD, ..., DIEDFL_ATTACHEDONLY)。但我仍然只得到DB_DEVNODES_CHANGED event.

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我的控制器可以正常工作,但键盘不能正常工作?如何让它适用于我的键盘?

你有没有考虑过GetRawInputDeviceList() and GetRawInputDeviceInfo(),对 pData 使用 RID_DEVICE_INFO 并检查它的 dwType?

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

根据评论: WM_INPUT_DEVICE_CHANGE 仅适用于已调用的应用程序RegisterRawInputDevices()并特别要求提供此通知。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Win32 确定键盘何时连接/断开 的相关文章

随机推荐