Win32确定何时连接/断开键盘
我正在尝试确定键盘何时连接或断开连接。 我尝试了以下策略:
RegisterDeviceNotification
如何在DirectInput中确定键盘断开连接时,建议使用如MSDN上所述的RegisterDeviceNotifaction。 当我尝试这个时,我在窗口回调中得到了DB_DEVNODES_CHANGED
事件,它没有提供其他信息(只是一些未知设备已经改变了连接状态)。 我为注册尝试了各种GUID: 4D36E96B-E325-11CE-BFC1-08002BE10318
(几个网站说这是键盘的类guid)和从IDirectInput8::EnumDevices(DI8DEVCLASS_KEYBOARD, ..., DIEDFL_ATTACHEDONLY)
检索的IDirectInput8::EnumDevices(DI8DEVCLASS_KEYBOARD, ..., DIEDFL_ATTACHEDONLY)
。 但我仍然只得到DB_DEVNODES_CHANGED
事件。
IDirectInput8 :: EnumDevices
每次调用IDirectInput8::EnumDevices(DI8DEVCLASS_KEYBOARD, ..., DIEDFL_ATTACHEDONLY)
都应该只枚举附加的设备。 但是,当我断开键盘的连接时, EnumDevices
仍会枚举EnumDevices
。 当我对我的游戏控制器(类型为DI8DEVCLASS_GAMECTRL
)执行相同操作时,控制器仅在连接时枚举,允许我确定其连接状态。
其他function
我试过了:
-
IDirectInput8::GetDeviceStatus
-
IDirectInputDevice8::GetCapabilities
-
IDirectInputDevice8::GetDeviceInfo
-
IDirectInputDevice8::GetDeviceState
-
IDirectInputDevice8::Poll
所有function都成功,并且无法确定键盘是否已连接。
我也看过MSDN的键盘部分 ,但无济于事。
问题
- 成功完成此任务的任何人都可以证实我采取了正确的方法吗?
- 我还有其他function或API吗?
- 任何提供示例的网站(我用google搜索失败了)?
- 为什么
EnumDevices
适用于我的控制器而不是我的键盘? 我如何让它适用于我的键盘?
您是否考虑过GetRawInputDeviceList()
和GetRawInputDeviceInfo()
,对pData使用RID_DEVICE_INFO并检查它的dwType?
这将使您获得初始状态,然后如果您的wndProc处理WM_INPUT_DEVICE_CHANGE,您可以使用参数来检测添加/删除,并且可以将lParam发送到GetRawInputDeviceInfo()
。
每条评论:WM_INPUT_DEVICE_CHANGE只会到达已调用RegisterRawInputDevices()
并专门询问此通知的应用程序。