我试图了解如何初始化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;
}
答案 0 :(得分:0)
存在消息循环,因此程序不会简单地死掉。现在它没有任何终止条件,但是如果主线程中没有某种循环,程序将只是进入UnhookWindowsHookEx调用然后终止。
答案 1 :(得分:0)
来自MSDN(WH_KEYBOARD_LL):
在安装它的线程的上下文中调用此钩子。通过向安装了挂钩的线程发送消息来进行调用。因此,安装挂钩的线程必须具有消息循环。
要从另一个线程中止消息循环,您可以使用PostThreadMessage
发布WM_NULL或WM_QUIT,或者如果您想使用事件作为停止点,请使用MsgWaitForMultipleObjects
代替GetMessage
信号。
如果你想从钩子里面中止,你可以使用PostQuitMessage
。