【发布时间】:2023-04-02 10:06:01
【问题描述】:
我想让某个线程停止工作。线程函数如下:
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);
}
}
以前有人遇到过这个问题吗?
【问题讨论】:
-
我认为 WM_QUIT 是为了退出应用程序。我不确定是否有任何副作用。 msdn.microsoft.com/en-us/library/windows/desktop/…
-
它说这条消息导致 GetMessage 函数返回 0,这是我的 while 条件。 @Stefan
-
使用调试器和/或发布一个最小的、可验证的和完整的示例。
-
如果您发布的代码是您的实际代码,则您将一个空指针传递给
GetMessage()。您需要将其指向MSG结构的实际实例。 -
不知道这是否会导致问题,但我注意到您将
wcout和const char*混合在一起,例如在wcout << "RunKeyLogger ..."
标签: c++ multithreading winapi message-queue