使用原始输入获取鼠标的设备 ID/Handle
Getting the device ID/Handle of a mouse with Raw Input
我正在研究使用原始输入 api 来监听按键和鼠标点击。到目前为止,我的键盘按键工作正常,我能够为此触发事件并读取按下了哪个键。但是,我无法让鼠标事件以相同的方式工作。
当消息通过
WndProc(ref Message)
,有一个设备句柄与设备 ID(键盘、鼠标和 HID)列表中的任何内容都不匹配。此外,原始输入缓冲区为空,所有字段均为零。
有人对 how/why 这件事有什么建议吗?
注意,我一直在尝试使用:
private static extern uint GetRawInputDeviceInfo(IntPtr hDevice, uint command, ref DeviceInfo data, ref uint dataSize);
获取有关点击事件的源设备的任何数据,但数据同样也是 empty/zero。
谢谢
编辑:
启动时,我得到原始输入看到的所有设备的列表:
var pRawInputDeviceList = Marshal.AllocHGlobal((int)(dwSize * deviceCount));
GetRawInputDeviceList(pRawInputDeviceList, ref deviceCount, (uint)dwSize);
获得此设备列表后,我遍历它们并将它们添加到单独的 dictionary<deviceID, eventType>
。
后来,当我通过 WndProc(ref Message)
收到消息后,我获取了 message.LParam
下的标识符,但这与我原始列表中的任何设备 ID 都不匹配。
进一步调试后,我发现在 Visual Studio 中调试原始输入充其量是棘手的。
也就是说,我的结论是,如果您尝试单步执行处理键事件和鼠标点击的原始输入代码,请注意您实际上在每个步骤中都遵循相同的线程。在我的例子中,我会收到一个鼠标事件并击中一个断点。在 类 之间移动时,使用 F10/F11 逐步执行会导致不一致。 (鼠标事件突然是按键事件等等)
因此,我发现使用 Visual Studio 中的 UI 命令可以更好地工作,而不是将关键事件引入流程。
我正在研究使用原始输入 api 来监听按键和鼠标点击。到目前为止,我的键盘按键工作正常,我能够为此触发事件并读取按下了哪个键。但是,我无法让鼠标事件以相同的方式工作。
当消息通过
WndProc(ref Message)
,有一个设备句柄与设备 ID(键盘、鼠标和 HID)列表中的任何内容都不匹配。此外,原始输入缓冲区为空,所有字段均为零。
有人对 how/why 这件事有什么建议吗?
注意,我一直在尝试使用:
private static extern uint GetRawInputDeviceInfo(IntPtr hDevice, uint command, ref DeviceInfo data, ref uint dataSize);
获取有关点击事件的源设备的任何数据,但数据同样也是 empty/zero。
谢谢
编辑:
启动时,我得到原始输入看到的所有设备的列表:
var pRawInputDeviceList = Marshal.AllocHGlobal((int)(dwSize * deviceCount));
GetRawInputDeviceList(pRawInputDeviceList, ref deviceCount, (uint)dwSize);
获得此设备列表后,我遍历它们并将它们添加到单独的 dictionary<deviceID, eventType>
。
后来,当我通过 WndProc(ref Message)
收到消息后,我获取了 message.LParam
下的标识符,但这与我原始列表中的任何设备 ID 都不匹配。
进一步调试后,我发现在 Visual Studio 中调试原始输入充其量是棘手的。
也就是说,我的结论是,如果您尝试单步执行处理键事件和鼠标点击的原始输入代码,请注意您实际上在每个步骤中都遵循相同的线程。在我的例子中,我会收到一个鼠标事件并击中一个断点。在 类 之间移动时,使用 F10/F11 逐步执行会导致不一致。 (鼠标事件突然是按键事件等等)
因此,我发现使用 Visual Studio 中的 UI 命令可以更好地工作,而不是将关键事件引入流程。