我正在学习C / C ++,最近我创建了一个按键记录器,主要是因为它是一个简单的学习项目。因此,我要做的是循环运行GetAsynKeyState()来检查键的状态。当我检查CPU时,它的周期会峰值,因为我一直在运行带有条件的循环。

在我看来,做这种事情很浪费,我相信更大,更高级的软件不会使用这种技术。

问题:按下某个键时,将创建一个中断以供内核处理。我的程序可以像内核一样被“唤醒”吗,还是唯一的解决方案不断检查按下的键?专业应用程序会做什么?

此外,编程语言实现了事件监听器,它们如何完成此任务,轮询或其他某种魔术?

最佳答案

挂钩是一种机制,用于在事件到达应用程序之前对其进行拦截(例如,鼠标操作或击键)。接收这些事件的函数称为筛选器函数(请参见下面的MyKbHook。)要被称为筛选器,必须将其附加到Windows钩子(请参见下面的SetWindowHookEx)。

如果一个挂钩连接了多个过滤器功能,则Windows将维护一系列过滤器功能。最后安装的功能在链的开头,而第一个安装的功能在结尾。

LRESULT CALLBACK MyKbHook( int nId, WPARAM wParam, LPARAM lParam )
{
   char keyPressed;

   KBDLLHOOKSTRUCT *pHook = (KBDLLHOOKSTRUCT *)lParam;
   switch( wParam )
   {
       case WM_KEYUP:
       {
          //get the key code
          keyPressed= (char)pHook->vkCode;
       }
       break;
       default:
           return CallNextHookEx( NULL, nId, wParam, lParam );
       break;
   }


   //Each function implementing a hook must call the next hook in chain before return
   return CallNextHookEx( NULL, nId, wParam, lParam);
}


// somewhere in your code where you want start tracking
    HHOOK hookKB = SetWindowHookEx(WH_KEYBOARD,(HOOKPROC)MyKbHook,hInst,0);

// when you do not need it anymore you SHOULD uninstall it
 UnhookWindowsHookEx(hookKB);

关于c++ - C/C++获取键,无需轮询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23600335/

10-12 20:40