等待没有控制台或窗口的应用程序中的按键

时间:2015-10-25 02:09:45

标签: c windows

我需要一种从没有控制台或GUI窗口的应用程序获取按键的方法。我目前正在使用GetAsyncKeyState进行轮询,但这会占用不必要的CPU时间。

有更好的解决方案吗?

注意:由于应用程序没有控制台,因此我无法使用getchar或其他此类仅限控制台的功能。

1 个答案:

答案 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;
}