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