我正在学习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_CHAR
或WM_KEYDOWN
。比钩子简单多了