通过 PostThreadMessage 发送 WM_QUIT 时发生访问冲突

Access violation when sending WM_QUIT via PostThreadMessage

我想让某个线程停止工作。线程函数如下:

unsigned __stdcall keyloggingmanager::RunKeyLogger(void * args) {

    UNREFERENCED_PARAMETER(args);
    wcout << "RunKeyLogger Thread Started !" << endl;
    HINSTANCE appInstance = NULL;
    HHOOK _keyboardHook = NULL;
    appInstance = GetModuleHandle(NULL); // getting the current module handle
    _keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, ThisObj->KeyPressHandler, appInstance, GLOBAL_HOOK); // setting the hook.
    LPMSG msg = { 0 };
    while (GetMessage(msg, NULL, 0, 0) != 0)
    {
        TranslateMessage(msg);
        DispatchMessage(msg);
    }

    cout << "Got WM_QUIT, aborting...\n";
    UnhookWindowsHookEx(_keyboardHook);
    if (_keyboardHook == NULL) {
        wcout << L"UNABLE TO HOOK" << endl; 
    }
    else if(appInstance == NULL)
    {
        wcout << L"UNABLE TO GET MODULE HANDLE" << endl;
    }
    return 0;
 }

用于停止线程的行如下:

PostThreadMessage(AboveThreadId, (UINT)WM_QUIT, NULL, NULL);

我使用此方法遇到访问冲突异常。 我尝试了几种变体,例如:

while ( GetMessage(msg, hWnd, 0, 0) )
{
   if ( msg->message == WM_QUIT )
   {
       break;
   }
   else
   {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
   } 
} 

以前有人遇到过这个问题吗?

LPMSG msg = { 0 };

这声明了一个指向 MSG 结构的指针。然后将该指针传递给 GetMessage,但不为指向的指针分配实际的 MSG 结构。

替换

LPMSG msg = { 0 };

MSG msg;

分配一个MSG结构。然后像这样调用GetMessage

while ( GetMessage(&msg, NULL, 0, 0) )

传递那个MSG结构的地址。