大家好我现在需要录制用户的一段鼠标点击事件,需要记录左键按下,左键抬起,右键按下,右键抬起,还有两次点击的时间差等等一系列数据。然后回放模拟。一开始我使用MFC的windows消息处理机制来实现的。发现重大的问题是只对该MFC的点击有效,如果出了MFC的窗口区域点击就无法记录了。第二次我hook了鼠标点击消息用的是WH_MOUSE_LL,然后再wParam里面switch选择左右键按下抬起四种情况。把hook做成dll,全局钩子,三个函数sethook,unhook,foozing做主程序和dll的接口,没有什么参数的传递。但是对于鼠标的点击事件记录的非常不完整。我想既然是全局的钩子应该会对每一次的点击都有处理和记录(记录是我自己的鼠标钩子回调函数里面的功能),但是非常不完整。希望大家可以帮我想想,如果需要的话可以贴上代码。对于鼠标的模拟点击,我用的是mouse_event函数,应该没有什么问题。WH_MOUSE_LL里面的lParam包含的point是绝对于全屏幕的还是相对于客户区的?谢谢大家了。最近发帖比较多,有些还没有彻底弄懂,等过了这一阵子一块儿结贴。

解决方案 »

  1.   


    #include <stdio.h>#include <windows.h>
    HHOOK g_ms_hook = 0;
    HHOOK g_kb_hook = 0;
    LRESULT CALLBACK kb_proc (int code, WPARAM w, LPARAM l)
    {
    printf((w==WM_KEYDOWN)?"按下%c\n":"抬起%c\n",((PKBDLLHOOKSTRUCT)l)->vkCode);
    return CallNextHookEx (g_kb_hook, code, w, l);
    }
    LRESULT CALLBACK ms_proc (int code, WPARAM w, LPARAM l)
    {
    if(w == WM_LBUTTONDOWN)
    printf("按下左键\t");
    else if(w == WM_LBUTTONUP)
    printf("抬起左键\t");
    else if(w == WM_RBUTTONDOWN)
    printf("按下右键\t");
    else if(w == WM_RBUTTONUP)
    printf("抬起右键\t");
    else if(w == WM_MOUSEMOVE)
    printf("鼠标移动\t");
    else
    printf("未知按键\t"); printf("x:%d\ty:%d\n",((PMSLLHOOKSTRUCT)l)->pt.x,((PMSLLHOOKSTRUCT)l)->pt.y); return CallNextHookEx (g_ms_hook, code, w, l);
    }
    int main (void)
    {
        g_kb_hook = SetWindowsHookEx (WH_KEYBOARD_LL,kb_proc,GetModuleHandle (NULL),0);
    g_ms_hook = SetWindowsHookEx (WH_MOUSE_LL, ms_proc,GetModuleHandle(NULL),0);    if (g_kb_hook == NULL || g_ms_hook == NULL)
        {
    printf("安装钩子出错\n");
            return 0;
        };
        MSG msg;
        while (GetMessage (&msg, NULL, 0, 0))
        {
            TranslateMessage (&msg);
            DispatchMessage (&msg);
        };
        UnhookWindowsHookEx (g_kb_hook);
        return 0;
    };
      

  2.   


    首先非常感谢。话说这是你当场写的?厉害!CSDN真是牛人大本营只有一个问题哈,'WH_MOUSE_LL' : undeclared identifier 怎么处理?