通过 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
结构的地址。
我想让某个线程停止工作。线程函数如下:
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
结构的地址。