一、前言
一直想做一个鼠标连点器,但在网上照片各种鼠标点击软件,均不符合要求,要么收费,要么不好用,要么不好使,于是乎就想起自己会写程序,为何自己能动手非要吵吵呢,于是乎就着手去新建qt工程开始干,在qt文档里找了mouse类的api函数,什么mousepos啊,mousemove啊,mouseclick啊,应有尽有,但后来在做的时候发现这些api都需要传入一个参数就是要控制的地方的句柄,但这不是我想要的,我想要控制的是在 桌面或者外部程序的地方,如果单存的控制本程序的按键或者某个地方,还用得着这么麻烦吗,后来就发现如果获取到桌面的句柄,也可以调用鼠标控制外部桌面上的应用程序等,于是乎在网上找获取桌面句柄的方式,但是事实并不尽如人意,没有找到,搁置了几天,这两天出差晚上无聊,就搜索一帆qt鼠标操作器,结果发现了新大陆,不一定非要用那一种api控制鼠标操作,同样有其他方式可以操作,只是我不懂,也无从而知这个方式到底是从哪里能寻得到在需要的时候,很多地方都是如此,但就是网上有大牛能找得到并随意的使用,这里话不多说,直接上参考链接和继续往下分享我的经验。
参考链接:Qt如何模拟鼠标点击? --> fearlazy
二、环境
我的qt环境是 QT5.7 MinGW
三、正文
mouse_event没有返回值,有5个参数。第一个参数就是操作鼠标的标志(如鼠标左键按下,右键按下等),可选值
第二和第三个参数很明显就是坐标值,如果第一个参数设置了MOUSEEVENTF_ABSOLUTE则表示绝对坐标,否则是相对坐标。你四个参数表示鼠标滚轮滚动的值,如果第一个参数为MOUSEEVENTF_WHEEL才有用。最后一个参数表示鼠标事件的附加信息,不知道有啥用。
关于相对坐标和绝对坐标的差异:如果是相对坐标(即没有设置MOUSEEVENTF_ABSOLUTE)那第二和第三个参数的单位就是像素。如果是绝对坐标(即设置了MOUSEEVENTF_ABSOLUTE)需要进行换算。dx和dy的取值范围都是0 ~ 65535(单位不是像素)。我们需要将目标坐标转换为到dx和dy取值范围中的某一个值。假设屏幕分辨率为1366x768,目标像素坐标为100,200 那么dx和dy分别为100*65535/1366、 200*65535/768。
(关于参数dx和dy有一点很奇怪,经过测试dx和dy的值对鼠标按下和鼠标松开并没有作用,也就是说设置了dx和dy后鼠标都是在当前位置按下或松开)。
模拟鼠标点击
模拟鼠标点击需要先让鼠标移动到指定位置,可以使用MOUSEEVENTF_MOVE。然后点击,使用MOUSEEVENTF_LEFTDOWN和MOUSEEVENTF_LEFTUP。关键代码如下:
qDebug()<<"mouse clicked";::mouse_event(MOUSEEVENTF_MOVE|MOUSEEVENTF_ABSOLUTE,1920*65535/1920,1080*65535/1080,0,0);::mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);Sleep(50);::mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
代码很简单一看就能懂,例子中被注释的代码SetCursorPos(x,y)也能实现移动鼠标的功能。最后写个例子看看效果:
但是目前点击按键控制外部窗口之后,鼠标是不会停的, 当我加入键盘之后,键盘只能聚焦在窗口才有效,这就导致了鼠标在外面连续点击时,根本停不下来,然后就得想办法让软件获取到后台的键盘事件,这就需要后台一直监听键盘了,用到了一个hook方式,这个方式代码如下:
connect( KeyCapturer::instance(), &KeyCapturer::getKey, [=](int key){qDebug()<<QString::number(key);});startHook();
然后添加对应的两个操作文件,文件具体代码见如下下载链接吧,我把我所有控制这部分程序整合到一起发布出来。
下载链接:clicked11月11日.rar_qt控制鼠标-QT代码类资源-CSDN下载
四、 结语
看视乎很简单的东西,往往做起来会发费更多的时间和精力,学无止境,前进吧少年。