我需要一种从没有控制台或GUI窗口的应用程序获取按键的方法。我目前正在使用GetAsyncKeyState
进行轮询,但这会占用不必要的CPU时间。
有更好的解决方案吗?
注意:由于应用程序没有控制台,因此我无法使用getchar
或其他此类仅限控制台的功能。
答案 0 :(得分:3)
这是low level hook,因此它从内核接收事件。这意味着即使是针对其他应用程序,您也会收到这些事件。
#include <stdio.h>
#include <Windows.h>
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam){
KBDLLHOOKSTRUCT *kbd = (KBDLLHOOKSTRUCT*)lParam;
switch(nCode){
case HC_ACTION:
switch(wParam){
case WM_KEYUP:
case WM_KEYDOWN:
printf("[%i %s %c]\r\n", kbd->time,
wParam == WM_KEYUP ? "Up" : "Down",
kbd->vkCode);
break;
}
break;
}
return CallNextHookEx(0, nCode, wParam, lParam);
}
int main(int argc, char** argv) {
HHOOK kbdHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, 0, 0);
MSG msg;
while (GetMessage(&msg, 0, 0, 0)) {
}
UnhookWindowsHookEx(kbdHook);
return 1;
}