gpt4 book ai didi

winapi - 记录USB鼠标事件

转载 作者:行者123 更新时间:2023-12-02 07:21:03 25 4
gpt4 key购买 nike

在 Windows 中捕获和记录全局 USB 鼠标事件的最佳方法是什么?我已经使用 low level mouse callback 编写了一个小型数据捕获程序。然而,这对我来说还不够低级:这种方法允许您捕获鼠标光标在屏幕上的位置(即屏幕坐标),而不是捕获实际上是相对运动的实际鼠标事件(想想 delta-x和 delta-y)。

我可以查看每个事件的位置增量,但由于屏幕坐标被限制在 0 和屏幕宽度/高度之间,因此一些数据丢失。另外,我不知道如果像游戏这样的全屏程序改变屏幕分辨率或执行其他可能影响鼠标事件的操作,会发生什么。

那么是否还有其他用户模式方法可以在比 SetWindowsHookEx Hook 更低的级别记录 USB 鼠标事件?我想在 Windows 进行任何处理之前获取物理鼠标事件。

最佳答案

由于没有其他人回答,我只是报告到目前为止我所发现的内容。据我了解,Windows中记录鼠标数据的方式至少有5种:

  1. LowLevelMouseProc回调机制。这种方法的局限性在于它报告鼠标光标在屏幕上的位置,而不是从鼠标接收到的原始数据。这意味着数据已被处理。

  2. raw input API捕获从鼠标(或任何其他 HID 设备)发送的原始数据。

  3. DirectInput允许您以最小的延迟捕获原始鼠标和键盘(以及其他设备)数据。 DirectInput 的情况有点令人困惑,因为它是一个旧的 API,而新的 API 取代了它,XInput 并不支持所有 devices the older one did .

  4. event tracing API它允许您在用户模式程序中捕获内核级 ETW 跟踪。

  5. 编写 KMDF 过滤设备驱动程序以捕获最低级别的鼠标 USB 流量。

最后一种解决方案是最复杂、最强大的解决方案。很少有商业应用程序能够真正做到这一点(甚至更多!)。 BusHound 就是一个例子。

我不太确定第四种解决方案(ETW 方法)。显然它最适合最新版本的 Windows。我找不到任何示例程序可以执行与我的想法类似的操作(即记录原始鼠标事件)。而且,它似乎足够复杂,即使是一个简单的测试程序也需要相当多的精力来编写。最后,我不知道它是否能让我得到实际的鼠标报告。

第二个解决方案,原始输入 API 非常易于使用。我可以在几个小时内编写一个简单的程序来使用它。然而,它有一个很大的限制:它基于发送到应用程序窗口的 WM_INPUT 消息。如果时间很关键(在我的例子中就是这样),那么这种方法就会受到限制,因为应用程序的消息循环按顺序处理消息。因此,从 USB 端口捕获鼠标事件到调用适当的消息处理程序的时间之间的延迟不是固定的,甚至是有限的。

总而言之,我没有对这个问题给出任何简单的答案。

关于winapi - 记录USB鼠标事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16839839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com