【问题标题】:Getting the device ID/Handle of a mouse with Raw Input使用原始输入获取鼠标的设备 ID/句柄
【发布时间】: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 都不匹配。

【问题讨论】:

  • 大概您正在调用GetRawInputDataGetRawInputBuffer。如果您使用第一个,则很可能存在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


【解决方案1】:

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

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

因此,我发现使用 Visual Studio 中的 UI 命令来逐步过渡和进入比将关键事件引入流程中效果更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多