Winapi 录制USB鼠标事件

Winapi 录制USB鼠标事件,winapi,usb,mouseevent,Winapi,Usb,Mouseevent,在Windows中捕获和记录全局USB鼠标事件的最佳方法是什么?我已经编写了一个小的数据捕获程序使用。但是,这对我来说还不够低:这种方法允许您捕获鼠标光标在屏幕上的位置(即屏幕坐标),而不是捕获实际的鼠标事件,这些事件实际上是相对运动(想想delta-x和delta-y) 我可以查看每个事件的位置增量,但由于屏幕坐标被剪裁在0和屏幕宽度/高度之间,因此一些数据丢失。此外,我不知道如果像游戏这样的全屏程序改变屏幕分辨率或做其他可能影响鼠标事件的事情会发生什么 那么,是否有任何其他用户模式方法可以在

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

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


那么,是否有任何其他用户模式方法可以在低于
SetWindowsHookEx
hooks的级别上记录USB鼠标事件?在Windows进行任何处理之前,我想先了解物理鼠标事件。

因为没有其他人回答,所以我只报告到目前为止我发现的情况。据我所知,在Windows中记录鼠标数据至少有5种方法:

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

  • 用于捕获从鼠标(或任何其他HID设备)发送的原始数据

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

  • 允许您在用户模式程序中捕获内核级ETW跟踪

  • 编写KMDF过滤器设备驱动程序以捕获最低级别的鼠标USB通信量

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

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

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


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

    下一步是USB过滤器驱动程序,这样您就可以看到低级别的流量。学习驱动程序编程技能大约需要一年的时间。这项功能并不完全值得,但当您完成后,您当然会对USB和驱动程序了解更多。不过,在这里你无法得到帮助。@HansPassant编写设备驱动程序正是我希望避免的!我在这方面有一些经验,但已经很多年了,我所记得的是那是一个如此复杂的世界。