Keylogger如何显着改善PostMessage的性能()

Rob*_* P. 5 .net c# winapi winforms

我想通过在干净的状态下在我的系统上运行'基准',安装键盘记录器并重复基准测试来查看我是否能够检测到系统上是否存在键盘记录器.想法是键盘记录器需要消耗资源才能正确运行并且应该导致较低的基准分数.

在代码中,我基本上编写了两个while循环,它使用win32API调用SendMessage()和PostMessage()来模拟击键.它执行循环达到给定的时间量并记录它发送的成功消息的数量.

我期待键盘记录器要么没有任何可测量的差异(毕竟,在桌面上执行了很多'东西',所有的时间,并且我认为键盘记录器可能不会使用很多......)或者它会导致数字略低.

这主要是我在' SendMessage() '调用的情况下看到的.

我不明白的是,我的基准显示对PostMessage()的调用数量急剧增加

平均许多执行,在安装键盘记录器之前,我每秒看到大约10k PostMessage().安装了一个键盘记录器后,我现在每秒看到几乎25k次调用PostMessage().

这对我没有任何意义.

如果我对PostMessage的理解是正确的,它会向进程的消息队列添加一条Windows消息并继续执行(而SendMessage会一直等待,直到进程在返回之前处理该消息).我希望PostMessage比SendMessage执行得更快,并且一旦消息队列已满,一些消息可能会丢失......但是我的有限理解中的任何内容都无法帮助我理解键盘记录器如何提高性能 - 如此显着的余量.

我觉得代码非常简单.我可以确认它确实注册为击键(我将它们发送到记事本)并且他们的键盘记录器正在记录它们.

有人可以向我解释我错过了什么吗?

键盘记录器如何提高性能?!

更新 我运行基准测试10次并平均结果.
暂停键盘记录器(以便它仍然安装但不记录)仍然产生了很高的结果.卸载键盘记录器并重新启动机器后,平均10次运行现在为每秒9.9k; 非常符合我原来的结果.

我必须重启我的机器才能完成卸载.

Han*_*ant 8

对PostMessage()调用没有多少限制.在内部,它必须获取一个锁来访问线程的消息队列,以便以安全的方式附加消息.这里的异常值是没有记录器这么慢,每秒10K的呼叫并不多.只要应用程序正在清空队列,Windows内部可能会有一段时间阻止呼叫.不知道这是不是真的.

这在很大程度上取决于键盘记录器使用的钩子,不止一个候选者.但是,只有当从队列中检索到一个消息并将其分派到窗口时,才会检测到消息是否已添加到队列中.像WH_GETMESSAGE,WH_CALLWNDPROC或WH_CALLWNDPROCRET.所以接下来是记录器会使队列变.

这为您所看到的内容提供了解释,如果您在没有限制的情况下调用PostMessage(),那么您将溢出消息队列.默认情况下,它只能包含10,000条消息.如果你溢出它,你将获得快速回报,你将测量更高的费率.

所以我猜你忘了查看PostMessage()的返回值.当无法添加消息时,它返回FALSE.