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

时间:2012-03-29 18:09:10

标签: c++ c winapi keyboard device

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

RegisterDeviceNotification

MSDN中建议使用how to determine keyboard disconnected in DirectInput中所述的RegisterDeviceNotifaction。当我尝试这个时,我在窗口回调中得到DB_DEVNODES_CHANGED事件,它没有提供其他信息(只是某些未知的设备已经改变了连接状态)。我为注册尝试了各种GUID:4D36E96B-E325-11CE-BFC1-08002BE10318(几个网站说这是键盘的类guid)和从IDirectInput8::EnumDevices(DI8DEVCLASS_KEYBOARD, ..., DIEDFL_ATTACHEDONLY)检索到的guidInstance。但我仍然只能得到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
  6. 所有功能都成功,并且无法确定键盘是否已连接。

    我也查看了MSDN的keyboard section,但没有用。

    问题

    1. 任何成功完成此任务的人都可以确认我采取了正确的方法吗?
    2. 我还有其他功能或API吗?
    3. 任何提供示例的网站(我用google搜索失败)?
    4. 为什么EnumDevices对我的控制器而不是我的键盘正常工作?我如何使它适用于我的键盘?

1 个答案:

答案 0 :(得分:3)

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

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

每条评论:WM_INPUT_DEVICE_CHANGE仅适用于已调用RegisterRawInputDevices()且已明确要求此通知的应用。