低级键盘挂钩间歇性地调用,GetMessage永远不会返回

时间:2014-04-08 13:03:04

标签: c++ winapi keyboard-hook message-loop

我在工作线程中设置了一个低级键盘钩子,它也运行一个消息循环。大约1/3的击键触发了钩子函数,并且没有在我的消息循环中释放GetMessage函数。由于与后者有关的事情,消息也没有排队(我刚开始使用Windows'消息循环)。什么会导致只有一些按键触发一个钩子?是否有一些设置/功能调用我没有让GetMessage正常工作(根据this我没有遗漏任何东西)?

这是我的钩子设置和消息循环:

MIL_UINT32 MFTYPE MessageThread( void *v_DataEx )
{
MSG msg;

// Setup key listener
keyEvent = CreateEvent( NULL, FALSE, FALSE, NULL );
HINSTANCE instance = GetModuleHandle(NULL);
hookRes = SetWindowsHookEx( WH_KEYBOARD_LL, &KeyStrokeHook, instance, 0 );
HWND h = FindWindow( NULL, NULL );

while(GetMessage( &msg, h, 0, 0 ) > 0) // also tried with h = 0
{
    printf("Received message\n");
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
UnhookWindowsHookEx( hookRes );
return M_TRUE;
}

我的钩子功能:

LRESULT CALLBACK KeyStrokeHook( _In_  int code, _In_  WPARAM wParam, _In_  LPARAM lParam )
{
if( code < 0 )
    return CallNextHookEx( hookRes, code, wParam, lParam );

if( wParam == WM_KEYDOWN ) // If key pressed, not released
{
    keyStroke = ((KBDLLHOOKSTRUCT *)lParam)->vkCode;

    SetEvent( keyEvent );
}
return CallNextHookEx( hookRes, code, wParam, lParam );
}

0 个答案:

没有答案