计算鼠标点击次数C.

时间:2014-08-04 06:13:26

标签: c++ c winapi mouseevent hook

我有一个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()函数。如何将该随机数作为参数发送?

谢谢你的帮助!

1 个答案:

答案 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返回从0RAND_MAX的整数,该整数是由标准库定义的常量。你可以在这里阅读更多关于rand的信息 - http://www.cplusplus.com/reference/cstdlib/rand/

此外,如果您想存储一些随机数并且能够从mouseProc访问它,您可以给它全局范围,但请注意,将所有变量设置为全局并不是一个好习惯。 http://en.wikipedia.org/wiki/Scope_(computer_science)