while循环使用了大量的CPU时间

时间:2009-09-16 04:10:23

标签: c++ keylogger

我正在为个人兴趣创建一个击键记录器,并且想知道如何捕获它们并将它们用作函数(如关键快捷键)。

我得到了代码来了解keylogger和GetAsyncKeyState()是如何工作的here

我让它在Code :: Blocks下运行,但最奇怪的是当我检查我的任务管理器时,我的CPU使用率上升到100%。当我关闭程序时,它会重新开启,当我重新打开它时会恢复到100%。

我认为这是因为无限循环不断检查输入,但我想知道是否有任何方法可以在不失去功能的情况下降低CPU使用率。

P.S我如何制作关键捷径?例如,按 Ctrl + E 可退出程序。

3 个答案:

答案 0 :(得分:6)

你的程序基本上占用了它所能用的任何CPU时间,因为它永远不会有理由停止执行 - 当它到达循环结束时它立即再次开始,并且没有理由延迟循环中的任何处理体。

大多数应用程序不会连续轮询键盘的状态,而是侦听操作系统广播的键盘事件。在监听事件时,您的程序不需要消耗CPU时间,因此会在事件发生之前休眠,从而释放处理器以供使用。

(游戏通常是一个例外,因为它们通常会轮询键盘状态。但是,它们通常会限制它们执行此操作的频率 - 通常是最多一次一帧 - 因此CPU使用率仍然有限。)

答案 1 :(得分:3)

基本上,您想要使用此功能:

HHOOK SetWindowsHookEx(
  __in  int idHook,
  __in  HOOKPROC lpfn,
  __in  HINSTANCE hMod,
  __in  DWORD dwThreadId
);

你可以阅读参数的含义(周围有很多例子),但回答你问题的部分是第二个参数。您将lpfn设置为指向回调函数,并且每次按下某个键时,您的函数(记录击键的函数)都会被调用。

这不仅适用于键盘事件,请查看:SetWindowsHook()

答案 2 :(得分:1)

在Windows上,您需要在Windows API中插入low level keyboard hook。然后,您将在LowLevelKeyboardProc函数上获得回调,然后您可以使用该函数进行记录。这将使用相当多的0%CPU,并保证能够捕获每个密钥。

至于处理全局按键以退出记录器,您可以在LowLevelKeyboardProc中查找它,因为您将拦截每个键,但更好的解决方案是使用RegisterHotKey然后查找WM_HOTKEY事件。消息循环。这是一个更好的解决方案,因为

  1. LowLevelKeyboardProc的CPU负担会减少,这对于低级挂钩非常重要。
  2. 适用于其他未监控每次按键的应用程序。