C/ c++按下键而不轮询

  • 本文关键字:c++ c++ io kernel polling
  • 更新时间 :
  • 英文 :


我正在学习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);

专业方法取决于不同的操作系统。在Windows上,你只能使用Windows消息。根据您的确切需要,您通常会使用WM_CHARWM_KEYDOWN。比钩子简单多了

相关内容

  • 没有找到相关文章

最新更新