【发布时间】:2016-06-28 17:03:23
【问题描述】:
我正在使用原始输入 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 都不匹配。
【问题讨论】:
-
大概您正在调用
GetRawInputData或GetRawInputBuffer。如果您使用第一个,则很可能存在RAWINPUT结构的编组问题,如果您使用的是第二个,则可能无法正确分配内存。还有你说there's a device handle that doesn't ever match anything from the list of device IDs是在做什么比较? -
@theB 我添加了一个编辑,希望能更好地解释你的问题。我正在使用 GetRawInputData(),我可以查看 marshal 位,看看是否有任何东西出现
标签: c# windows mouseevent raw-input