首页
社区
课程
招聘
写一个鼠标钩子拦截右键消息,然后模拟右键单击,但是模拟的右键反应很慢,右键菜单弹出有延迟,这是怎么回事?
2023-4-3 17:41 6065

写一个鼠标钩子拦截右键消息,然后模拟右键单击,但是模拟的右键反应很慢,右键菜单弹出有延迟,这是怎么回事?

2023-4-3 17:41
6065

写一个鼠标钩子拦截右键消息,然后模拟右键单击,但是模拟的右键反应很慢,右键菜单弹出有延迟,这是怎么回事?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode == HC_ACTION)
    {
        MOUSEHOOKSTRUCT* p = reinterpret_cast<MOUSEHOOKSTRUCT*>(lParam);
        if (p->dwExtraInfo == 0x521)
        {
            return CallNextHookEx(g_hook, nCode, wParam, lParam);
        }
        if (wParam == WM_RBUTTONDOWN)
        {
             return 1;
        }
        if (wParam == WM_RBUTTONUP)
        {
            INPUT input = {};
            input.type = INPUT_MOUSE;
            input.mi.dwExtraInfo = 0x521;
            input.mi.dwFlags = MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP;
            SendInput(1, &input, sizeof(INPUT));
            return 1;
        }
 
    }
    return CallNextHookEx(g_hook, nCode, wParam, lParam);
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2023-4-3 17:47 被lmwuxia编辑 ,原因:
收藏
点赞1
打赏
分享
最新回复 (3)
雪    币: 48
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
万神fake 2023-4-4 11:34
2
0
DWORD WINAPI SimulateMouseClick(LPVOID lpParam)
{
    INPUT input = {};
    input.type = INPUT_MOUSE;
    input.mi.dwExtraInfo = 0x521;
    input.mi.dwFlags = MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP;
    SendInput(1, &input, sizeof(INPUT));
    return 0;
}
LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode == HC_ACTION)
    {
        MOUSEHOOKSTRUCT* p = reinterpret_cast<MOUSEHOOKSTRUCT*>(lParam);
        if (p->dwExtraInfo == 0x521)
        {
            return CallNextHookEx(g_hook, nCode, wParam, lParam);
        }
        if (wParam == WM_RBUTTONDOWN)
        {
            return 1;
        }
        if (wParam == WM_RBUTTONUP)
        {
            HANDLE hThread = CreateThread(NULL, 0, SimulateMouseClick, NULL, 0, NULL);
            CloseHandle(hThread);
            return 1;
        }
    }
    return CallNextHookEx(g_hook, nCode, wParam, lParam);
}

可能是因为模拟鼠标操作的代码执行时间过长,导致操作的反应较慢。当钩子函数拦截到右键抬起事件时,会调用SendInput函数来模拟鼠标的右键单击操作,而SendInput函数会将模拟的输入消息发送给系统,由系统来处理这些消息。由于钩子函数是在系统消息处理流程中被调用的,如果钩子函数执行时间过长,则会延迟系统对输入消息的处理,从而导致右键菜单弹出有延迟。 为了避免这种情况,可以尝试在钩子函数中减少执行时间,例如将模拟鼠标操作的代码放到一个单独的线程中执行,或者使用更快速的模拟鼠标操作的方法。另外,也可以尝试减少模拟鼠标操作的次数,只在必要的情况下模拟右键单击操作,从而减少延迟的发生。

雪    币: 204
活跃值: (714)
能力值: ( LV9,RANK:195 )
在线值:
发帖
回帖
粉丝
palkiver 2023-4-4 16:01
3
0
万神fake DWORD&nbsp;WINAPI&nbsp;SimulateMouseClick(LPVOID&nbsp;lpParam) { &nbsp;&nbsp;& ...
chatgpt疯狂水贴
雪    币: 4440
活跃值: (3476)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
木志本柯 2023-4-4 18:15
4
0
论坛老会员啊  6
游客
登录 | 注册 方可回帖
返回