【发布时间】:2014-09-26 15:52:16
【问题描述】:
我有一个 C 代码来检查鼠标左键是否被按下。它工作正常,但我不知道如何在调用 final() 函数后取消挂钩并退出当前线程。
这是代码:
LRESULT CALLBACK mouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
static int count = 0;
static int finalNum;
if (count==0){
//////Generate random number
srand(time(NULL)); // Seed the time
finalNum = rand() % (150 - 50) + 50; // Generate the number, assign to variable.
////////////////////////////////////////////////////////////////////////////
}
//int count = 0;
MOUSEHOOKSTRUCT * pMouseStruct = (MOUSEHOOKSTRUCT *)lParam;
if (pMouseStruct != NULL){
if (wParam == WM_LBUTTONDOWN)
{
count++;
printf("%d",count);
if (count==finalNum){ // user clicked random times the mouse so we launch the final function
printf("\ndone!\n");
final();
}
printf("clicked");
}
printf("Mouse position X = %d Mouse Position Y = %d\n", pMouseStruct->pt.x, pMouseStruct->pt.y);
}
return CallNextHookEx(hMouseHook, nCode, wParam, lParam);
}
DWORD WINAPI MyMouseLogger(LPVOID lpParm)
{
HINSTANCE hInstance = GetModuleHandle(NULL);
// here I put WH_MOUSE instead of WH_MOUSE_LL
hMouseHook = SetWindowsHookEx(WH_MOUSE_LL, mouseProc, hInstance, NULL);
MSG message;
while (GetMessage(&message, NULL, 0, 0)) {
TranslateMessage(&message);
DispatchMessage(&message);
}
UnhookWindowsHookEx(hMouseHook);
return 0;
}
void custom_delay(){
}
int main(int argc, char *argv[])
{
int count = 0;
HANDLE hThread;
DWORD dwThread;
//////Generate random number to call a function after rand() number of clicks
srand(time(NULL)); // Seed the time
int finalNum = rand() % (150 - 50) + 50; // Generate the number, assign to variable.
////////////////////////////////////////////////////////////////////////////
printf("%d", finalNum);
hThread = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)MyMouseLogger, (LPVOID)argv[0], NULL, &dwThread);
if (hThread)
return WaitForSingleObject(hThread, INFINITE);
else
return 1;
}
printf("Keep going");
}
我已经尝试过 ExitThread(0);但它会关闭所有线程,而不仅仅是 MyMouseLogger 进程以打印“继续”。
我该怎么做?
感谢您的帮助!
【问题讨论】:
-
当
MyMouseLogger线程退出时,你的main等待它的调用将返回,而main本身将返回......程序终止。你还能期待什么?如果你想看到“继续”,请去掉return之前的WaitForSingleObject(...。 -
您可能缺少一些 Windows 或 Win32 标签。这看起来不像 C++11
std::thread或 Posix pthreads。 -
尝试在
final函数中发布一条WM_QUIT消息。 -
[OT]:您只需播种一次,
rand不是线程安全的。您可以改用 C++11 中<random>的新功能。
标签: c++ c multithreading winapi