将GetMessage()与LowLevelKeyboardProc Hook结合使用

时间:2018-01-05 22:32:49

标签: c winapi keyboard-hook

我试图了解如何初始化LowLevelKeyboardProc挂钩。

在我对密钥记录器的最小方法中,如下所示,为什么我需要使用消息循环来使钩子工作,即使它只是挂在第一个循环中而且从不打印“MSG \ r \ n”?

如果没有机会重新检查时间条件,我怎么能解开?

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

LRESULT CALLBACK LLKBProc(int nCode, WPARAM wParam, LPARAM lParam) {
    KBDLLHOOKSTRUCT *keyMetaP = (KBDLLHOOKSTRUCT *) lParam;
    printf("\nkey = %x", keyMetaP->vkCode);
    return CallNextHookEx(NULL, nCode, wParam, lParam);
}
int main() {
    // get handle to process
    HINSTANCE hExe = GetModuleHandle(NULL);

    // set hook
    HHOOK keyHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC) LLKBProc, hExe, 0);

    // msg loop
    MSG msg;
    while ( GetMessage(&msg, 0, 0, 0) != -1 ) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
        printf("MSG\r\n");
    }
    UnhookWindowsHookEx(keyHook);

    return 1;
}

2 个答案:

答案 0 :(得分:0)

存在消息循环,因此程序不会简单地死掉。现在它没有任何终止条件,但是如果主线程中没有某种循环,程序将只是进入UnhookWindowsHookEx调用然后终止。

答案 1 :(得分:0)

来自MSDN(WH_KEYBOARD_LL):

  

在安装它的线程的上下文中调用此钩子。通过向安装了挂钩的线程发送消息来进行调用。因此,安装挂钩的线程必须具有消息循环。

要从另一个线程中止消息循环,您可以使用PostThreadMessage发布WM_NULL或WM_QUIT,或者如果您想使用事件作为停止点,请使用MsgWaitForMultipleObjects代替GetMessage信号。

如果你想从钩子里面中止,你可以使用PostQuitMessage