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)执行相同操作时,仅在连接控制器时才枚举该控制器,从而使我能够确定其连接状态。
其他功能
我试过了:
IDirectInput8::GetDeviceStatusIDirectInputDevice8::GetCapabilitiesIDirectInputDevice8::GetDeviceInfoIDirectInputDevice8::GetDeviceStateIDirectInputDevice8::Poll所有功能都会成功执行,并且无法了解是否已连接键盘。
我也浏览了MSDN的键盘部分,但无济于事。
问题
EnumDevices对我的控制器但对我的键盘不能正常工作?以及如何使它适用于键盘?您是否考虑过GetRawInputDeviceList()使用GetRawInputDeviceInfo()RID_DEVICE_INFO 作为 pData 并检查它的 dwType?
这将为您提供初始状态,然后如果您的 wndProc 处理 WM_INPUT_DEVICE_CHANGE 您可以使用参数来检测添加/删除,并且 lParam 可以直接发送到GetRawInputDeviceInfo().
根据评论:WM_INPUT_DEVICE_CHANGE 仅适用于已调用RegisterRawInputDevices()并专门请求此通知的应用程序。