使用Qt控制鼠标自动点击屏幕上某一点

Qt本身自己的鼠标获取函数,只能获取在Qt窗口内部的坐标值,而且这个坐标值是相对于Qt控件的。想要获取显示屏的绝对坐标值怎么办呢?使用Windows系统的API接口。网络上有许多这样的文章,但都是些高手写的。自己还得揣摩半天。这里我给出傻瓜式的教程,方便那些只会用Qt,看到Windows API字样就懵圈的初学者。
先创建调用Windows API的C++类。
在你的Qt项目上点击右键,add New,选择C++ class。这里假设类名是MouseAct。mouseact.h中代码如下:

#include <QWidget>
#include "windows.h"//这是引入Windows操作系统的APIclass MouseActs : public QWidget
{    
    Q_OBJECT
    public:    
    MouseActs(QWidget *parent = nullptr);
    POINT pos = {0,0} ;    //保存鼠标点击点的x、y坐标。这里的坐标值是整个显示屏幕窗口的坐标    //与Qt程序窗口无关。与你操作系统的分辨率有关。 
    public slots:    
    void getClickedPos() ;//获取鼠标点击处的全局坐标值(屏幕坐标)    
    void doPressAct(int,int,int);//执行鼠标动作。
};

mouseact.cpp中代码如下:

#include "mouseacts.h" 
MouseActs::MouseActs(QWidget *parent)
    : QWidget (parent)
{

 }//获取鼠标点击处的全局坐标值(屏幕坐标)
void MouseActs::getClickedPos ()
{    
GetCursorPos(&pos);
} //执行鼠标动作。
void MouseActs::doPressAct(int x,int y,int type_id)
{      
    SetCursorPos(x,y);
    if(type_id==1)
    {//鼠标单击一下左键  
     mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTDOWN,x, y, 0, 0);
     mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTUP,x, y, 0, 0);   
      }    
      else if(type_id==2)
      {//鼠标双击左键       
      mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTDOWN,x, y, 0, 0);
      mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTUP,x, y, 0, 0);
      mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTDOWN,x, y, 0, 0);
      mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_LEFTUP,x, y, 0, 0);
      }
}

说明:

getClickedPos ()函数的作用是调用windows的接口函数GetCursorPos(&pos)来获得鼠标光标的坐标值. 注意这里获得的pos值是整个屏幕,作为窗口的屏坐标值。Pos是头文件中声明的变量,这里在调用的时候使用的是&pos的样式,所以他会把获得的坐标值保存在pos中。我建立这个函数是为了让qt的其他窗口进行调用。

doPressAct(int x,int y,int type_id)这个函数是用来实现鼠标左键单击或者双击的操作的,X和y是要传递给鼠标函数的坐标值。传递Id这个变量是为了要区分是执行单击还是双击操作。mouse_event() 这个函数是windows API的函数。他使用这个MOUSEEVENTF_LEFTDOWN,表示左键按下,MOUSEEVENTF_LEFTUP表示左键松开。鼠标右键的话,把left变成right就行了。

SetCursorPos(x,y); 这个函数是要把这个鼠标的光标先移动到坐标xy的地方,这个函数是windows的API接口函数不是qt的。来自windows.h。要实现鼠标单击或者双击,必须先把鼠标的光标移动到坐标xy的地方,然后才可以执行鼠标的单击或者双击操作,这一点一定要注意。

关于怎么使用上面这个类的问题:
使用的流程是:
1、Qt项目的其它窗口控件重定义mousePressEvent(QMouseEvent *event) 函数,。mousePressEvent(QMouseEvent *event) 函数是不需要你显式调用的,你点击鼠标的时候,它会自动调用。它的代码如下,

void Dialog::mousePressEvent(QMouseEvent *event)
{
    //未取定坐标值时,取坐标值。否则不做什么。
    if(notfixed){
        if(event->button ()==Qt::LeftButton){
            mouseAct->getClickedPos () ;
            x_LE -> setText (QString::number (mouseAct->pos.x)) ;
            y_LE -> setText (QString::number (mouseAct->pos.y)) ;
        }
    }
}

我这里声明了一个bool型变量notfixed。意思是说,没有取定坐标值的时候,才调用WindowsAPI取屏幕坐标。如果已经取定坐标值了,就不要调用了。免得鼠标执行单双击操作的时候,坐标变化了,不是你定的位置。
外部控件获得屏幕的指定位置的坐标后,再在一定的触发条件下调用mouseact的void MouseActs::doPressAct(int x,int y,int type_id)就可以完成鼠标单击双击操作了。

下面给大家分享一个我做的小程序。
//download.csdn.net/download/skyskyhaha/12235088
使用方法如下:
1、程序主窗口上有个数值框,是用来调节主窗口透明度的。把程序窗口的透明度调低一些,让主窗口透明一些。以便能够透过控件窗口看到后面的其它窗口。
2、用主窗口覆盖你想要点击的其它任何程序或网页的按钮部位,鼠标点击主窗口相应位置,会获取相应的坐标值。然后点击“固定坐标”按钮。此时,测试按钮、开始按钮都可以使用了。
3、你点击测试按钮,5秒后,会自动点击你刚才指定的位置。注意,要先把你的Qt程序窗口挪开,不要遮挡点击位置。
4、设置点击间隔,点击开始后,会每隔XX分钟后自动点击相应位置。
在这里插入图片描述

  • 7
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值