获取带有Raw Input的鼠标的设备ID/句柄

本文关键字:ID 句柄 鼠标 Raw Input 获取 | 更新日期: 2023-09-27 17:53:11

我正在使用原始输入api来监听按键和鼠标点击。到目前为止,我有键盘按下工作,我能够得到事件触发这样,并读取哪个键被按下。然而,我在让鼠标事件以同样的方式工作时遇到了麻烦。

当消息通过WndProc(ref Message),有一个设备句柄不匹配设备id列表中的任何东西(键盘,鼠标和id)。此外,原始输入缓冲区为空,所有字段为零。

有没有人有关于如何/为什么会发生这种情况的建议?

注意,我一直在尝试使用:private static extern uint GetRawInputDeviceInfo(IntPtr hDevice, uint command, ref DeviceInfo data, ref uint dataSize);获取关于click事件源设备的任何数据,但数据同样为空/零。

感谢编辑:

在启动时,我得到原始输入所看到的所有设备的列表:

var pRawInputDeviceList = Marshal.AllocHGlobal((int)(dwSize * deviceCount));
GetRawInputDeviceList(pRawInputDeviceList, ref deviceCount, (uint)dwSize);

一旦我有了这个设备列表,我就遍历它们并将它们添加到单独的dictionary<deviceID, eventType>中。

后来,一旦我通过WndProc(ref Message)收到消息,我在message.LParam下获取标识符,但这与我的原始列表中的任何设备ID都不匹配。

获取带有Raw Input的鼠标的设备ID/句柄

在进一步调试之后,我发现在Visual Studio中调试原始输入是很棘手的。

也就是说,我的结论是,如果您试图逐步执行处理键事件和鼠标单击的原始输入代码,请注意您实际上在每个步骤中都遵循相同的线程。在我的例子中,我将接收一个鼠标事件并击中一个断点。使用F10/F11在类之间移动时导致不一致。(鼠标事件突然变成按键事件等等)

因此,我发现使用Visual Studio中的UI命令来跳过并进入工作,而不是将关键事件引入流程中。