C++ 低级键盘钩子间歇性调用,GetMessage永远不会返回

C++ 低级键盘钩子间歇性调用,GetMessage永远不会返回,c++,winapi,keyboard-hook,message-loop,C++,Winapi,Keyboard Hook,Message Loop,我在一个工作线程中设置了一个低级键盘挂钩,该线程还运行一个消息循环。我大约有1/3的按键会触发钩子函数,没有一个会释放消息循环中的GetMessage函数。由于与后者相关的原因,消息也不会排队(我刚刚开始使用Windows的消息循环)。什么只会导致一些击键触发钩子?是否有一些设置/函数调用我遗漏了,以使GetMessage正常工作(根据我没有遗漏任何内容) 这是我的挂钩设置和消息循环: MIL_UINT32 MFTYPE MessageThread( void *v_DataEx ) { MSG

我在一个工作线程中设置了一个低级键盘挂钩,该线程还运行一个消息循环。我大约有1/3的按键会触发钩子函数,没有一个会释放消息循环中的GetMessage函数。由于与后者相关的原因,消息也不会排队(我刚刚开始使用Windows的消息循环)。什么只会导致一些击键触发钩子?是否有一些设置/函数调用我遗漏了,以使GetMessage正常工作(根据我没有遗漏任何内容)

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

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 );
}
LRESULT回调击键钩子(_In_uuu-int-code,_In_uwparam-WPARAM,_In_WPARAM-LPARAM)
{
如果(代码<0)
返回CallNextHookEx(hookRes、code、wParam、lParam);
if(wParam==WM_KEYDOWN)//如果按键,则不释放
{
击键=((KBDLLHOOKSTRUCT*)lParam)->vkCode;
SetEvent(keyEvent);
}
返回CallNextHookEx(hookRes、code、wParam、lParam);
}

摆脱FindWindow(),您必须为低级钩子创建自己的窗口。CreateWindow/Ex call.Message循环应该是
while(GetMessage(&msg,0,0,0))
@DavidHeffernan注意我代码中的注释。我已经尝试过h=0,结果相同。@HansPassant我正在尝试
CreateWindow(NULL,NULL,WS\u CHILD,0,0,HWND\u MESSAGE,NULL,NULL,NULL)
但得到一个“参数不正确”(代码87)错误。我还将
instance
作为倒数第二个参数进行了尝试,同样的错误。所有预定义的系统类似乎都不符合我对第一个类的需求parameter@vlad417在这种情况下,您应该注册自己的窗口类,但我建议您一次只尝试一件事。从CreateWindow示例开始,然后添加低级钩子。一旦工作正常,您可以调整窗口创建。