我正在使用原始输入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都不匹配。
答案 0 :(得分:0)
进一步调试之后我发现在Visual Studio中调试原始输入充其量是棘手的。
那就是说,我的结论是,如果你试图逐步处理处理关键事件和鼠标点击的原始输入代码,请注意你实际上是为每一步执行相同的线程。在我的情况下,我会收到一个鼠标事件并达到一个突破点。在类之间移动时,使用F10 / F11逐步执行导致的不一致。 (鼠标事件突然成为关键事件,等等)
因此,我发现使用Visual Studio中的UI命令可以更好地工作,而不是将关键事件引入流中。