3

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

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

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

4

1 回答 1

5

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

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

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

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

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

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

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

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

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

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

于 2013-06-01T23:15:11.257 回答