gpt4 book ai didi

c# - 键盘记录器如何显着提高 PostMessage() 的性能

转载 作者:太空狗 更新时间:2023-10-29 22:52:47 24 4
gpt4 key购买 nike

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

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

我原以为键盘记录器不会产生任何可测量的差异(毕竟,桌面上一直在执行大量“东西”,而且我认为键盘记录器可能不会使用很多......)或者这会导致数字略低。

这主要是我在“SendMessage()”调用中看到的情况。

我不明白的是,我的基准测试显示调用 PostMessage()

的次数急剧增加

平均多次执行,在安装键盘记录器之前,我看到每秒大约 10k PostMessage()。安装键盘记录器后,我现在看到每秒将近 25k 次调用 PostMessage()。

这对我来说没有任何意义。

如果我对 PostMessage 的理解是正确的,它会向进程的消息队列中添加一个 windows 消息并恢复执行(而 SendMessage 会等到进程处理完消息才返回)。我希望 PostMessage 比 SendMessage 执行得更快,并且一旦消息队列已满,一些消息可能会丢失......但在我有限的理解中,没有任何东西可以帮助我理解键盘记录器如何提高性能 - 如此显着的利润.

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

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

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

更新我正在运行基准测试 10 次并对结果取平均值。
暂停键盘记录器(以便它仍然安装,但不记录)仍然产生了很高的结果。卸载键盘记录器并重新启动我的机器后,10 次运行的平均值现在是每秒 9.9k;与我的原始结果非常一致。

我确实需要重新启动我的机器才能完成卸载。

最佳答案

限制 PostMessage() 调用的因素并不多。在内部,它必须获得一个锁才能访问线程的消息队列,从而以安全的方式追加消息。这里的异常值是没有记录器这样做太慢了,每秒 10K 次调用并不多。只要应用程序正在清空队列,Windows 内部很可能会暂时阻止调用。不知道这是不是真的。

这在很大程度上取决于键盘记录器使用的是什么钩子(Hook),有不止一个候选者。但是只有当从队列中检索到一条消息并将其发送到窗口时,才能检测到消息是否已添加到队列中。像 WH_GETMESSAGE、WH_CALLWNDPROC 或 WH_CALLWNDPROCRET。所以接下来是记录器会使清空队列变慢。

这为您所看到的提供了解释,如果您在没有节流的情况下调用 PostMessage(),那么您将溢出消息队列。默认情况下,它只能包含 10,000 条消息。如果溢出它,您将获得快速返回并且测量到更高的速率。

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

关于c# - 键盘记录器如何显着提高 PostMessage() 的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13605408/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com