首页 > 解决方案 > 通过 PostThreadMessage 发送 WM_QUIT 时访问冲突

问题描述

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

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);
   } 
} 

有没有人遇到过这个问题?

标签: c++multithreadingwinapimessage-queue

解决方案


LPMSG msg = { 0 };

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

代替

LPMSG msg = { 0 };

MSG msg;

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

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

传递该MSG结构的地址。


推荐阅读