吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 9922|回复: 52
收起左侧

[C&C++ 原创] 简易鼠标连击修正工具原理与实现

  [复制链接]
苏紫方璇 发表于 2018-4-3 17:57
1、起因
近日鼠标的微动开关出问题了,偶尔单击鼠标变成双击,测试了下10次单击有2-3次会变为双击,网上买的鼠标还要两三天的时间才能到,于是就做了个简单的小工具先应付着。本程序原理较为简单,但由于本人水平有限,代码写的较烂,请各位多多指点。
2、原理
利用鼠标钩子获取鼠标按下和弹起的操作,计算两次点击的时间差,如果太快了,那肯定就是微动开关的问题造成的,然后屏蔽掉第二次点击操作就可以了。
3、实现
3.1、主要API介绍
1、设置钩子SetWindowsHookEx
[C] 纯文本查看 复制代码
HHOOK SetWindowsHookEx(          int idHook,
    HOOKPROC lpfn,
    HINSTANCE hMod,
    DWORD dwThreadId
);

参数:idHook:消息类型 lpfn:消息处理函数  hMod:模块句柄  dwThreadId:关联的线程ID
2、取消钩子UnhookWindowsHookEx
[C] 纯文本查看 复制代码
BOOL UnhookWindowsHookEx(          HHOOK hhk
);

参数:hhk:SetWindowsHookEx的返回值
3、查询计数器频率QueryPerformanceFrequency
[C] 纯文本查看 复制代码
BOOL QueryPerformanceFrequency(          LARGE_INTEGER *lpFrequency
);

参数:lpFrequency:计数器频率
4、查询计数器QueryPerformanceCounter
[C] 纯文本查看 复制代码
BOOL QueryPerformanceCounter(          LARGE_INTEGER *lpPerformanceCount
);

参数:lpPerformanceCount:计数器计数
3.2、基本流程
3.2.1主程序流程
程序启动,获取命令行参数,得到设置的延迟时间,启动钩子进行消息处理。
3.2.2消息处理流程
区分是否为第一次按下,第一次按下:记录按下时间A。非第一次按下:将上次按下时间设为A。
记录当前时间B,若B-A大于设置的间隔,则放行。若小于则取消本次按下操作,并设置一个标记,让对应的弹起操作也取消。
弹起操作与之类似。
3.3、代码实现
3.3.1、启动钩子
[C] 纯文本查看 复制代码
//启动钩子
BOOL StartHook()
{
        //获取计数器频率
        QueryPerformanceFrequency(&TimeFreq);
        //设置鼠标底层钩子
        hHook = SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)HookProc, NULL, 0);
        if (hHook) return TRUE;
        return FALSE;
}

3.3.2、取消钩子
[C] 纯文本查看 复制代码
//卸载钩子
BOOL UnLoadHook()
{
        return(UnhookWindowsHookEx(hHook));
}

3.3.3、消息处理

[C] 纯文本查看 复制代码
//消息处理
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
        if (nCode == HC_ACTION)
        {
                int time = 0;
                switch (wParam)
                {
                //左键按下
                case WM_LBUTTONDOWN:
                        //初始化点击时间
                        if (LClkTimeStart.QuadPart == 0)
                                QueryPerformanceCounter(&LClkTimeStart);
                        else
                                LClkTimeStart.QuadPart = LClkTimeNext.QuadPart;
                        //获取本次的按下时间
                        QueryPerformanceCounter(&LClkTimeNext);
                        //计算两次左键按下间隔时间,单位ms
                        time = (((LClkTimeNext.QuadPart - LClkTimeStart.QuadPart) * 1000) / TimeFreq.QuadPart);
                        //若已经设置弹起无效,则恢复。
                        if (LBtnUPCancel)
                        {
                                LBtnUPCancel = FALSE;
                        }
                        //在屏蔽范围内,屏蔽此次按下消息,并设置下次弹起消息无效
                        if (time < BnDelay && time>0)
                        {
                                LBtnUPCancel = TRUE;
                                //输出调试信息
                                if (Debug)
                                {
                                        MyOutputDebugString("LDtime=%d————LDNCancel\n", time);
                                }
                                return TRUE;
                        }
                        else
                        {
                                if (Debug)
                                {
                                        MyOutputDebugString("LDtime=%d\n", time);
                                }
                        }
                        break;
                //左键弹起
                case WM_LBUTTONUP:
                        //初始化点击时间
                        if (LClkTimeStart.QuadPart == 0)
                                QueryPerformanceCounter(&LClkTimeStart);
                        else
                                LClkTimeStart.QuadPart = LClkTimeNext.QuadPart;
                        //获取本次弹起时间
                        QueryPerformanceCounter(&LClkTimeNext);
                        //计算两次间隔
                        time = (((LClkTimeNext.QuadPart - LClkTimeStart.QuadPart) * 1000) / TimeFreq.QuadPart);
                        //若已经设置弹起取消,则取消标记并取消本次弹起
                        if (LBtnUPCancel)
                        {
                                LBtnUPCancel = FALSE;
                                if (Debug)
                                {
                                        MyOutputDebugString("LUtime=%d————LUPCancel\n", time);
                                }
                                return TRUE;
                        }
                        else
                        {
                                if (Debug)
                                {
                                        MyOutputDebugString("LUtime=%d\n", time);
                                }
                        }
                        break;
                default:
                        return(CallNextHookEx(hHook, nCode, wParam, lParam));
                        break;
                }
        }
        return(CallNextHookEx(hHook, nCode, wParam, lParam));
}

3.3.4、主程序

[C] 纯文本查看 复制代码
int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
{
        MSG msg;
        BOOL bRet;
        char Cmd[20] = { 0 };
        //设置互斥体,防止多开
        if (CreateMutex(NULL, TRUE, "_FixMouse_") != NULL)
        {
                if (ERROR_ALREADY_EXISTS == GetLastError())
                {
                        return 0;
                }
        }
        //提取命令行
        if (NULL== lpCmdLine)
        {
                MessageBox(NULL, "正确命令行为:40,0   延迟取值范围为1-499", "不正确的取值", MB_OK);
                return 0;
        }
        strcpy_s(Cmd, 20, lpCmdLine);
        char *s,*next;
        s = strtok_s(Cmd, ",",&next);
        if (NULL!=s)
        {
                BnDelay = strtol(s, NULL, 10);
                if (!(BnDelay > 0 && BnDelay < 500))
                {
                        MessageBox(NULL, "正确命令行为:40,0   延迟取值范围为1-499", "不正确的取值", MB_OK);
                        return 0;
                }
        }
        s = strtok_s(next,",",&next);
        if (NULL != s)
        {
                Debug = strtol(s, NULL, 10);
        }
        //启动钩子
        Flag = StartHook();
        //进入消息循环
        while ((bRet = GetMessage(&msg, NULL, 0, 0)) != -1)
        {
                if (bRet == 0)
                {
                        break;
                }

                TranslateMessage(&msg);    
                DispatchMessage(&msg);    
        }
        return msg.wParam;    //WinMain函数结束, 整个程序退出
}


4、添加其他部分
按照上面的代码,便可以做一个简易的鼠标连击修正工具,但是却无法操控,结束程序只能靠任务管理器结束进程。于是我做了一个托盘图标来控制,在这里代码不再赘述,有兴趣可以在附件中查看。



ps:本源码用VS2015编译通过,WIN10 X64 1709版本运行正常
鼠标连点修正工具.7z (218.05 KB, 下载次数: 309)

点评

su,抽空来一波VC键盘鼠标操控的普及贴呗~~ 思路、原理、步骤理得这么清析,甚至连排版都这么用心,真心期待后期能出个覆盖键鼠相关API的系列。。  发表于 2018-4-7 15:22

免费评分

参与人数 13吾爱币 +23 热心值 +13 收起 理由
smile1110 + 3 + 1 我很赞同!
洪崖洞洞主 + 1 + 1 支持你
qaz003 + 1 + 1 爽,就喜欢这类思路清析敲代码型的贴子。。谢谢
彩虹天空 + 1 + 1 热心回复!
吃饭睡觉打豆豆 + 2 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
wushaominkk + 6 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
一方鱼儿 + 1 + 1 楼主很强大,给你暖暖
woshishui123 + 2 + 1 我鼠标就是连击有问题 用到了 thanks
稀罕谁 + 1 + 1 谢谢@Thanks!
cr7890 + 1 + 1 虽然用不到,但很有意思~
zeg922 + 1 + 1 一个鼠标微动的事,不至于吧。
雪儿的绝佳 + 1 + 1 能传个成品吗 Thanks
610100 + 2 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 苏紫方璇 发表于 2018-4-4 09:23
天若幽心 发表于 2018-4-3 20:22
win10 64位,尝试添加注册表,开机时软件没有启动。是否是因为开机时一些程序加载不完整导致的?

我也不清楚什么问题,是不是杀软拦截了,按说应该可以开机启动的
 楼主| 苏紫方璇 发表于 2019-5-5 09:42
加油 发表于 2019-5-5 06:37
请教下 ,鼠标钩子做热键  、拦截操作(误按)等  玩各种游戏会被反外挂关照吗?

各家游戏保护不同,并不排除会被反外挂检测的可能。
头像被屏蔽
憨厚小猪 发表于 2018-4-3 18:06
lnshijia 发表于 2018-4-3 18:07
大神,膜拜
610100 发表于 2018-4-3 18:11
硬件出问题,软件来搞定

小白看不懂,真心来膜拜

点评

然而软件也就是暂时解决一下,bug还有很多,还是换硬件比较好  详情 回复 发表于 2018-4-3 19:08
莫愁前路无知己 发表于 2018-4-3 18:20
可以的,支持大神
as36601987 发表于 2018-4-3 18:33
为啥子按住不连点
thyonezhy 发表于 2018-4-3 18:42
支持发布原创
gunxsword 发表于 2018-4-3 18:50
呵呵,这个历害了,还是换个鼠标比较好吧!

点评

是的,但是这不是买的鼠标还没到么  详情 回复 发表于 2018-4-3 19:01
 楼主| 苏紫方璇 发表于 2018-4-3 19:01
gunxsword 发表于 2018-4-3 18:50
呵呵,这个历害了,还是换个鼠标比较好吧!

是的,但是这不是买的鼠标还没到么

免费评分

参与人数 1热心值 +1 收起 理由
610100 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

 楼主| 苏紫方璇 发表于 2018-4-3 19:08
610100 发表于 2018-4-3 18:11
硬件出问题,软件来搞定

小白看不懂,真心来膜拜

然而软件也就是暂时解决一下,bug还有很多,还是换硬件比较好

免费评分

参与人数 1热心值 +1 收起 理由
610100 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-3-29 15:47

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表