2

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

我得到了代码来了解键盘记录器和 GetAsyncKeyState() 是如何工作

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

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

PS我将如何制作快捷键?例如,按Ctrl+E使程序退出。

4

3 回答 3

6

您的程序基本上会耗尽所有 CPU 时间,因为它永远不会停止执行 - 当它到达循环末尾时,它会立即重新开始,并且没有理由延迟其在循环体内的任何处理。

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

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

于 2009-09-16T04:21:23.363 回答
3

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

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

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

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

于 2010-04-19T07:55:48.087 回答
1

在 Windows 上,您需要使用 Windows API插入低级键盘挂钩。然后你会在你的LowLevelKeyboardProc函数上得到一个回调,然后你可以用它来记录。这将使用几乎 0% 的 CPU,并保证捕获每个键。

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

  1. LowLevelKeyboardProc 的 CPU 负担会更小,这对于低级挂钩很重要。
  2. 它适用于不监视每次击键的其他应用程序。
于 2010-04-19T07:14:34.980 回答