我有一个C代码,用于检查是否按下了鼠标左边的按钮。它运行正常但我想用它来计算按钮被点击的次数,并且当按钮被随机点击一次时调用一个函数。
这是代码:
LRESULT CALLBACK mouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
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;
}
}
问题是每次发生鼠标事件时count变量都会重置为0,因此我无法跟踪用户使用鼠标单击的时间。
另一个问题是我想生成50到150之间的随机数,以调用final()函数。如何将该随机数作为参数发送?
谢谢你的帮助!
答案 0 :(得分:3)
由于你在一个函数中声明count
,它在调用函数时被分配,并在函数返回后立即自动释放,如果你想让count持续更长时间,你可以使它成为全局函数(在函数外声明它) )。
或者您在static
的延期中使用count
关键字,即static int count = 0
。当一个变量用static声明时,它被分配给整个程序的长度。这种方式当函数返回count
时不会被分配。
这里有关于静电的更多信息 -
What does static mean in ANSI-C
http://en.wikipedia.org/wiki/Static_variable
现在,对于问题的下一部分,您可以使用rand
函数在C中生成伪随机数。函数rand
返回从0
到RAND_MAX
的整数,该整数是由标准库定义的常量。你可以在这里阅读更多关于rand
的信息 -
http://www.cplusplus.com/reference/cstdlib/rand/
此外,如果您想存储一些随机数并且能够从mouseProc
访问它,您可以给它全局范围,但请注意,将所有变量设置为全局并不是一个好习惯。
http://en.wikipedia.org/wiki/Scope_(computer_science)