录制USB鼠标事件

时间:2013-05-30 15:13:39

标签: winapi usb mouseevent

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

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

那么还有其他用户模式方法来记录低于SetWindowsHookEx挂钩的USB鼠标事件吗?我想在Windows进行任何处理之前进入物理鼠标事件。

1 个答案:

答案 0 :(得分:5)

由于没有其他人回答,我只是报告我到目前为止所发现的内容。据我所知,在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流量。

  6. 最后一个解决方案是最复杂,最强大的解决方案。实际上很少有商业应用程序(以及更多!)。一个例子是BusHound。

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

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

    总而言之,我没有想出任何简单的答案。