自己琢磨了一上午左右,因为需要做一些测试的事情,所以想着能不能简化一些重复的鼠标操作。上网搜索到右一些工具,如惠普的qtp什么的,做自动化测试是挺方便的,但是要钱。身为一个资深白嫖档,花钱是不可能花钱的,想着就自己写一个吧。基本就是调用windows的api实现繁琐的鼠标点击操作。其他没什么的。这里需要用到钩子函数。不清楚的可以百度下
看代码:
.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTextEdit>
#include <QPushButton>
#include <QLabel>
#include <windows.h>
#include <QLineEdit>struct myPoint{int x;int y;long long btn;
};class Widget;
class Hook
{public:Hook();void InstallHook();void UnInstallHook();};class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();public slots:void SaveSetting();public:QTextEdit *m_pStepEdit=nullptr;QLineEdit *m_pSpeedEdit=nullptr;QLineEdit *m_pCountEdit=nullptr;};
#endif // WIDGET_H

.cpp

#include "widget.h"
#include <QVBoxLayout>
#include <QMouseEvent>
#include <qdebug.h>#include <windows.h>
#include <winuser.h>
#include <QIntValidator>static Widget *wgt;int m_Count=1;
int m_Speed=1000;Widget::Widget(QWidget *parent): QWidget(parent)
{wgt=this;this->resize(800,600);QFont textFont;textFont.setPointSize(12);textFont.setFamily("Microsoft YaHei");m_pStepEdit=new QTextEdit(this);m_pStepEdit->setFont(textFont);m_pSpeedEdit=new QLineEdit(this);m_pCountEdit=new QLineEdit(this);m_pSpeedEdit->setFont(textFont);m_pCountEdit->setFont(textFont);m_pSpeedEdit->setText("1000");m_pCountEdit->setText("1");m_pCountEdit->setValidator(new QIntValidator);m_pSpeedEdit->setValidator(new QIntValidator);QLabel *SpeedLabel=new QLabel(tr("Speed(ms) :"));QLabel *CountLabel=new QLabel(tr("Count:"));SpeedLabel->setFont(textFont);CountLabel->setFont(textFont);QHBoxLayout *SettingLayout=new QHBoxLayout(this);SettingLayout->addWidget(SpeedLabel);SettingLayout->addWidget(m_pSpeedEdit);SettingLayout->addWidget(CountLabel);SettingLayout->addWidget(m_pCountEdit);SettingLayout->setSpacing(5);SettingLayout->setMargin(5);QWidget *settingWgt=new QWidget(this);settingWgt->setLayout(SettingLayout);QPushButton *SaveBtn=new QPushButton(tr("Save"));SaveBtn->setFixedSize(100,27);SaveBtn->setFont(textFont);QVBoxLayout *mainLayout=new QVBoxLayout(this);mainLayout->addWidget(m_pStepEdit);mainLayout->addWidget(settingWgt);mainLayout->addWidget(SaveBtn);mainLayout->setSpacing(5);mainLayout->setMargin(5);this->setLayout(mainLayout);connect(SaveBtn,&QPushButton::clicked,this,&Widget::SaveSetting);Hook hok;hok.InstallHook();}Widget::~Widget()
{}void Widget::SaveSetting()
{m_Count=m_pCountEdit->text().toInt();m_Speed=m_pSpeedEdit->text().toInt();
}static HHOOK keyHook=nullptr;static HHOOK mouseHook=nullptr;
QList<myPoint> PointList;bool m_bF8=false;
bool m_bF9=false;
bool m_bF10=false;
LRESULT CALLBACK keyProc(int nCode,WPARAM wParam,LPARAM lParam)
{KBDLLHOOKSTRUCT *pkbhs=(KBDLLHOOKSTRUCT*)lParam;if(nCode == HC_ACTION&&lParam>0){//F8代表开始录制鼠标事件//F9暂停录制//F10执行操作//F11清空操作if(GetKeyState(pkbhs->vkCode)& 0x8000)  //判断键盘按下{if(pkbhs->vkCode==VK_F8){wgt->hide();wgt->m_pStepEdit->append("-----------------Recording-----------------");m_bF8=true;m_bF9=false;}if(pkbhs->vkCode==VK_F9){wgt->show();m_bF8=false;m_bF9=true;wgt->m_pStepEdit->append("-----------------End-----------------");}if(pkbhs->vkCode==VK_F10){wgt->m_pStepEdit->append("-----------------Starting-----------------");wgt->hide();for(int i=0;i<m_Count;i++)  //执行次数{for(int i=0;i<PointList.size();i++){SetCursorPos(PointList[i].x,PointList[i].y);Sleep(m_Speed);if(PointList[i].btn==WM_LBUTTONUP){mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);Sleep(10);mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);}else if(PointList[i].btn==WM_RBUTTONUP){mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);Sleep(10);mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);}else if(PointList[i].btn==WM_MBUTTONUP){mouse_event(MOUSEEVENTF_MIDDLEDOWN,0,0,0,0);Sleep(10);mouse_event(MOUSEEVENTF_MIDDLEUP,0,0,0,0);}}}wgt->m_pStepEdit->append("-----------------Finished-----------------");wgt->show();}if(pkbhs->vkCode==VK_F11){wgt->show();wgt->m_pStepEdit->clear();PointList.clear();}}}return CallNextHookEx(keyHook, nCode, wParam, lParam);
}LRESULT CALLBACK Mouseproc(int nCode, WPARAM wParam, LPARAM lParam)
{if(wParam == WM_LBUTTONUP||wParam == WM_RBUTTONUP||wParam == WM_MBUTTONUP)  //左 中 右键{if(m_bF8){POINT p;GetCursorPos(&p);myPoint Point;Point.x=p.x;Point.y=p.y;Point.btn=wParam;PointList.append(Point);QString strBtn="";if(wParam == WM_LBUTTONUP){strBtn="LeftBtn";}if(wParam == WM_RBUTTONUP){strBtn="RightBtn";}if(wParam == WM_MBUTTONUP){strBtn="MiddleBtn";}QString strText=QString("X:%1 Y:%2").arg(p.x).arg(p.y)+"Btn:"+strBtn;wgt->m_pStepEdit->append(strText);}}return CallNextHookEx(mouseHook,nCode,wParam,lParam);
}Hook::Hook()
{}void Hook::InstallHook()
{keyHook =SetWindowsHookEx( WH_KEYBOARD_LL,keyProc,nullptr,0); //注册键盘标钩子mouseHook =SetWindowsHookEx(WH_MOUSE_LL,Mouseproc,nullptr,0);  //注册鼠标钩子
}void Hook::UnInstallHook()
{if(keyHook!=nullptr){UnhookWindowsHookEx(keyHook);keyHook=nullptr;}if(mouseHook!=nullptr){UnhookWindowsHookEx(mouseHook);mouseHook=nullptr;}
}

界面很简洁的,基本就是记录下鼠标的位置,及是鼠标的左中右键。其他就没什么了,然后在重复执行操作就行。

界面大致是这样的,可以设置运行间隔时间,因为有些应用程序打开的时候速度很慢,所以你需要把执行的时间放慢一点,后面就是设置执行的次数。后面的话我会继续完善键盘事件,这个东西做好的话还是挺实用的。
欢迎评论区留言哦。

qt和C++调用windowsApi实现鼠标宏操作相关推荐

  1. python开发的录音机(二)让鼠标点击与开始录音同步(录制与回放鼠标宏)

    当我们用录音机录网上的音乐时,有一个场景让人困扰: 比如听以下页面中的一首歌,要在页面上点击一下播放按钮 如果想把这一首歌录下来,当点击了播放按钮再去点录音机的录音按钮时,中间有一个时间差.可能一不小 ...

  2. php可以调用windowsapi吗_2.如何调用WindowsApi

    2.如何调用WindowsApi 在上一篇章节中 很不专业的介绍了一下WindowsApi 如果你本身就知道 那你也压根不用看 如果你本身就不知道 就算我说的再多 估计你也觉得是多余 所以还是来点实际 ...

  3. 雷蛇鼠标宏文件_Razer推出DeathAdder V2与Basilisk V2游戏鼠标

    雷蛇(Razer)刚刚宣布了游戏鼠标产品线的新成员,分别是 DeathAdder 和 Basilisk 的继任者.命名上,该公司直接在后面加上了 V2 的标签.首先介绍 DeathAdder V2,其 ...

  4. 惠普g260鼠标宏软件_黑爵电竞鼠标AJ337 电竞手残党福音 鼠标宏一键火力全开

    2020年,可以说是英特尔最难受的一年,多年来的挤牙膏大法也不灵了,面对AMD更先进的7mm制程以及更多的线程数,加上本身更合理的售价,说实话就连一向占据处理器半壁江山的英特尔也感受到了很高的威胁.A ...

  5. 【Linux开发】【Qt开发】Qt界面键盘、触摸屏、鼠标的响应设置

    USB键盘 经过一番搜索,发现对Qt键盘的支持主要关系到两个方面: 1. 键盘类型确定: 4.7以前的Qt版本,如果是PS2圆孔键盘,Qt编译时需加上选项:-qt-kbd-vr41xx(未测试):如果 ...

  6. 在Ubuntu中用Qt基于OpenCV调用大恒相机

    在Ubuntu中用Qt基于OpenCV调用大恒相机 前言 视觉萌新买了工业相机却不会用,上网也查不到具体方法,没办法只能自己硬刚了.刚开始自己摸索,碰到好多问题解决不了,Qt报错不知道咋回事,缺少的链 ...

  7. 罗技g502鼠标宏设置教程分享

    罗技g502宏怎么设置?罗技g502鼠标是一款非常好用的游戏鼠标,拥有非常好的手感和灵明度,当然了这类游戏鼠标也支持设置鼠标宏,那么罗技g502鼠标宏设置怎么操作呢?下面就来看看具体的操作. 罗技g5 ...

  8. 完美解决双飞燕血手鼠标宏权限修改

    https://pan.baidu.com/s/1tpGd8KaFPNpVhRD2qysuhQ?pwd=mcc3 提取码: mcc3 复制这段内容后打开百度网盘手机App,操作更方便哦 完美解决双飞燕 ...

  9. c++调用python接口打包_在QT C++中调用 Python并将软件打包发布(裸机可运行)

    为了提高工作效率,需要一个可以自动生成多份相关联的word文档免去繁琐复制粘贴工作的软件.最后选定使用QT C++做界面和主要逻辑程序设计,对word的操作使用python写好对应的函数,然后在QT中 ...

最新文章

  1. 技术揭秘!百度搜索中台低代码的探索与实践
  2. 没有好看的 Terminal 怎么能够快乐地写代码
  3. 知识图谱学习笔记-风控知识图谱设计
  4. GCC安装UBUNTU
  5. 如何在 Mac 上的调度中心中查看打开的窗口和空间?
  6. java之RestTemplate的访问应用
  7. 蚂蚁课堂视频笔记思维导图-3期 十、分布式解决方案
  8. 不为人知的网络编程(八):从数据传输层深度解密HTTP
  9. java sync 实现原理_JAVA 同步实现原理
  10. 经典查找算法 --- R树
  11. httpCient 的getResponseBodyAsStream instead is recommended使用方法
  12. 【历史上的今天】3 月 2 日:雅虎正式成立;PC 设计先驱诞生;Excite@Home 破产
  13. PyTorch笔记 - Dropout: A Simple Way to Prevent Neural Networks from Overfitting
  14. 如何通过看原版电影学英语
  15. js逆向学习路线指南
  16. 安卓漫漫路之实现简单的弹幕.
  17. 上树建站教程:新手单页网站制作教程上集
  18. 微信小程序四种json配置文件详解
  19. ESP8266连接阿里云(二)烧录MQTT固件
  20. 记录使用gensim进行词向量增量训练(遇到的几个问题)

热门文章

  1. 女大学生修电脑时被植入偷窥软件,一举一动被“直播”;Deepmind 发布 AlphaGo 教学工具...
  2. php 判断 英文数字,php 判断中文,英文,数字
  3. li的inline-block出现间隙原因,解决方案
  4. 【算法】JavaScript冒泡排序
  5. STOMP error Whoops问题解决
  6. vim快捷键之复制(yy)+粘贴(p)+删除(dd)+撤销(u)+恢复(ctrl + r)大法
  7. 欧洲麦当劳正试用RFID温度传感标签,保证食品质量
  8. VBA Word画表格,填实线
  9. 虚拟机检测技术刨析(一)
  10. 马斯克称脑机接口可治疗肥胖症,SpaceX首批游客滞留国际空间站,苹果要下架一批长期不更新App,今日更多大新闻在此...