【发布时间】:2012-11-16 07:46:29
【问题描述】:
我想看看我是否能够通过在干净状态下的系统上运行“基准测试”、安装键盘记录器并重复基准测试来检测系统上是否存在键盘记录器。这个想法是键盘记录器需要消耗资源才能正确运行,并且应该导致较低的基准分数。
在代码中,我基本上编写了两个 while 循环,它们使用 win32API 调用 SendMessage() 和 PostMessage() 来模拟击键。它在给定的时间内执行循环并记录它发送了多少成功消息。
我希望键盘记录器不会产生明显的差异(毕竟,桌面上一直在执行很多“东西”,而且我认为键盘记录器可能不会使用很多......)或这会导致数字略低。
这就是我在“SendMessage()”调用中看到的大部分内容。
我不明白的是,我的基准测试显示调用 PostMessage()
的次数急剧增加平均多次执行,在安装键盘记录器之前,我看到每秒大约 10k PostMessage()。安装键盘记录器后,我现在看到每秒有近 25k 次 PostMessage() 调用。
这对我来说没有任何意义。
如果我对 PostMessage 的理解是正确的,它会在进程的消息队列中添加一条 windows 消息并恢复执行(而 SendMessage 会等到进程处理完消息后才返回)。我希望 PostMessage 的执行速度比 SendMessage 快,并且一旦消息队列已满,一些消息可能会丢失....但在我有限的理解中,没有任何东西可以帮助我理解键盘记录器如何提高性能 - 如此显着.
我觉得代码很简单。我可以确认它确实注册为击键(我将它们发送到记事本)并且他们的键盘记录器正在记录它们。
有人可以向我解释我缺少什么吗?
键盘记录器如何提高性能?!
更新
我正在运行基准测试 10 次并对结果进行平均。
暂停键盘记录器(以便它仍然安装,但不记录)仍然产生了很高的结果。卸载键盘记录器并重新启动我的机器后,10 次运行的平均值现在是每秒 9.9k;非常符合我原来的结果。
我确实必须重新启动机器才能完成卸载。
【问题讨论】:
-
最好打电话给SendInput
-
有趣的问题。暂停/卸载键盘记录器后性能会再次下降吗?这是为了确保性能差异实际上是由键盘记录器引起的,而不是在您重新执行基准测试时进行的其他优化(例如 Windows 或 .NET 运行时负责的优化)。
-
@erikkallen - 谢谢 - 我会调查 SendInput 看看是否有助于解决问题。
-
您还可以检查 GetLastError 是否返回某些内容,因此您的代码没有走完整的路径。
-
我们需要您的代码源和键盘记录器的源来理解和解释发生了什么。