使用原始输入获取设备ID /鼠标句柄

时间:2016-06-28 17:03:23

标签: c# windows mouseevent raw-input

我正在使用原始输入api来监听按键和鼠标点击。到目前为止,我有键盘按键工作,我能够为此事件触发事件,并读取按下了哪个键。但是,我无法以相同的方式使鼠标事件工作。

当消息进入时 WndProc(ref Message),设备句柄与设备ID(键盘,鼠标和HID)列表中的任何内容都不匹配。此外,原始输入缓冲区为空,所有字段均为零。

有没有人就如何/为何会发生这种情况提出建议?

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

由于

编辑:

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

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

我有了这个设备列表后,我会迭代它们并将它们添加到单独的dictionary<deviceID, eventType>

稍后,当我通过WndProc(ref Message)收到邮件后,我会抓取message.LParam下的标识符,但这与我原始列表中的任何设备ID都不匹配。

1 个答案:

答案 0 :(得分:0)

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

那就是说,我的结论是,如果你试图逐步处理处理关键事件和鼠标点击的原始输入代码,请注意你实际上是为每一步执行相同的线程。在我的情况下,我会收到一个鼠标事件并达到一个突破点。在类之间移动时,使用F10 / F11逐步执行导致的不一致。 (鼠标事件突然成为关键事件,等等)

因此,我发现使用Visual Studio中的UI命令可以更好地工作,而不是将关键事件引入流中。