Qt使用API实现鼠标点击操作
前段时间,工作需要进行数据录入,每次都要点击3次按钮,想让鼠标自行点击,只要下位机接入,就自动点击按钮把数据读出,录入到服务端,并且进行检测,说干就干,没有经验,那只有面向百度编程.
根据查到的资料,可以使用WinAPI进行鼠标模似.可以使用的函数有两个,一个是SendMessageA(),一个是mouse_evnet();进行鼠标操作的模似;
SendMessageA()的参数说明:
LRESULT SendMessageA(
[in] HWND hWnd,
[in] UINT Msg,
[in] WPARAM wParam,
[in] LPARAM lParam
);
mouse_evnet()的参数说明
VOID mouse_event(
DWORD dwFlags, // motion and click options
DWORD dx, // horizontal position or change
DWORD dy, // vertical position or change
DWORD dwData, // wheel movement
ULONG_PTR dwExtraInfo // application-defined information
);
|
名称
|
说明
|
|---|---|
|
MOUSEEVENTF_ABSOLUTE
|
dX和dY参数含有规范化的绝对坐标。如果不设置,这些参数含有相对数据:相对于上次位置的改动位置。此标志可设置,也可不设置,不管鼠标的类型或与系统相连的类似于鼠标的设备的类型如何。要得到关于相对鼠标动作的信息,参见下面备注部分。
|
|
MOUSEEVENTF_MOVE
|
这表示鼠标移动
|
|
MOUSEEVENTF_LEFTDOWN
|
这表示鼠标左键按下
|
|
MOUSEEVENTF_LEFTUP
|
这表示鼠标左键松开
|
|
MOUSEEVENTF_RIGHTDOWN
|
这表示鼠标右键按下
|
|
MOUSEEVENTF_RIGHTUP
|
这表示鼠标右键松开
|
|
MOUSEEVENTF_MIDDLEDOWN
|
这表示鼠标中键按下
|
|
MOUSEEVENTF_MIDDLEUP
|
这表示鼠标中键松开
|
|
MOUSEEVENTF_WHEEL
|
这表示鼠标轮被滚动,如果鼠标有一个滚轮。滚动的数量由dwData给出。
|
//使用此函数,必须引入windows.h头文件
#include <windows.h>
SendMessageA((HWND)winId(), WM_LBUTTONDOWN, BM_CLICK, 0);
SendMessageA((HWND)winId(), WM_LBUTTONUP, BM_CLICK, 0);
//WM_LBUTTONUP 左键抬起,
//BM_CLICK 按钮消息 点击
最后一个参数,其实是要填写按钮的句柄,如果你要发消的窗口是自绘的,那么此函数就不适用了.
此时可以采用第mouseEvent()具体的使用方法
//第一个参数:鼠标移动事件,也就是把鼠标移动到指定的坐标,第二个参数,和第3个参数是坐标的X和Y,此处需要进行计算点击位置相对于窗口的相对坐标,这里不坐讨论,网上有很多相关的资料,此处演示的是其中的一种,
//窗口左*65535/当前分辨率的X,窗口左*65535/当前分辨率的Y,最后两个参数不设置,填0
mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, getDzzcleft * 65535 / resolution_x, getDzzcTop * 65535 / resolution_y,0 ,0);
//第一个参数,左键按下
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
//第一个参数,左键抬起
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
思路:首先你需要获取组件在窗口上的相对坐标,然后再进行点击,这是因为,组件相对于窗口,这个坐标是恒定不变的,变化的只是窗口本身在桌面的位置,获取窗口在桌面的位置,需要先获取当前显示器的分辨率
这其中还有一个缩放比的问体,就是用户把窗体的大小改变了一点,此时,就需要重新计算了,我为了实现基本功能,把窗体的大小进行了固定,所以就规避了计算缩放比的问题.
EnumDisplaySettings()
获取分辨率的函数
第一步我们需要获取这个目标窗口
使用GetWindowrect();获取窗口矩形,然后显示这个窗口,使用ShowWindow显示的目录是为了激活目标窗体,并且将其置于顶层.
声明一个矩形变量 RECT rec
GetWindowRect(WindowHandle,&rec);
ShowWindow(WindowHandle, SW_NORMAL);
然后通把rec.left + 组件坐标.x 获取鼠标点击位置的x,rec.top + 组件坐标.y 获取鼠标点击位置的y
SetCursorPos(x,y);
将鼠标指针移动到 x,y,再使用mouse_event(),则实现了点击.
此方法使用QT5.9已经测试成功,喜欢我的文章,请点击关注,也欢迎交流学习.
Qt使用API实现鼠标点击操作的更多相关文章
- 使用powershell/vbs自动化模拟鼠标点击操作
今天想做windows上的自动化,所以才有了模拟鼠标点击的需求,先考虑用powershell实现: 首先先安装一个名为“WASP”免费可用的Powershell扩展程序,下载地址:http://was ...
- c++学生信息管理系统(window控制台实现鼠标点击操作)
翻起大一时写过的作业代码--一个学生信息管理系统,当时不会使用QT,不会MFC等库,只会c++,但是又想做一个有界面的,能够实现鼠标操作的程序.于是绞尽脑汁查资料,自己造轮子,最终写出来了下面的这个现 ...
- js监听鼠标点击操作
element.addEventListener('click', function() { /* do stuff here*/ }, false);
- Qt 不规则窗体 – 鼠标点击穿透(Linux也可以,有对x11的配置的方法)
之前写过如何用 Qt 现成的方法写出无边框半透明的不规则窗体:<Qt 不规则窗体 – 无边框半透明> 其实有一个很特殊的窗体属性一直以来都伴随着不规则窗体出现,这就是本文要介绍的鼠标点击穿 ...
- Qt Qgis 二次开发——鼠标点击识别矢量要素
Qt Qgis 二次开发--鼠标点击识别矢量要素 介绍: 识别矢量要素需要用到QGis的一个工具类:QgsMapToolIdentifyFeature 一个QgsMapTool的子类的子类,官方文档描 ...
- 截图技巧——鼠标按着不懂,同时点击截图快捷键(QQ为ctrl+alt+a)即可避免按下快捷键鼠标按下等操作消失截不到的尴尬。
截图技巧--鼠标按着不懂,同时点击截图快捷键(QQ为ctrl+alt+a)即可避免按下快捷键鼠标按下等操作消失截不到的尴尬.
- Qt之股票组件-股票检索--支持预览框、鼠标、键盘操作
目录 一.感慨一下 二.效果展示 三.搜索编辑框 1.编辑框 2.预览框 四.相关文章 原文链接:Qt之股票组件-股票检索--支持预览框.鼠标.键盘操作 一.感慨一下 之前做过一款炒股软件,个人觉着是 ...
- QT中Qtableview视图表格中点击表头进行排序
用QT写了一个小工具,主要是对Excel中大量的数据进行计算和显示. 写了有一段时间,然后断断续续的做一些修改和完善. 因为要显示的数据有多列,很自然的会想到要能够对显示的数据进行排序.如果直接操作m ...
- C#模拟鼠标、键盘操作
C语言 在程序中打开网页,模拟鼠标点击.键盘输入 一.简述 记--使用C语言 打开指定网页,并模拟鼠标点击.键盘输入.实现半自动填写账号密码,并登录网站(当然现在的大部分网站都有验证码 ...
- 参考:鼠标点击事件(Selenium)
1.鼠标右键点击操作:Actions action = new Actions(driver) ;action.contextClick(driver.findElement(By.xpath(xpa ...
随机推荐
- C++ NRV优化
NRV,named return value 某个函数返回一个对象时,在外部接收 A a = Fun(); 会调用复制构造函数 会损失性能 为何不能将函数Fun定义成传入引用a,然后直接在a上进行操作 ...
- 修改 input框、textarea框的placeholder样式
/* 设置input框提示内容的样式 */ input::-webkit-input-placeholder { font-size: 14px; color: #ccc; font-weight: ...
- mysql的日期时间类型格式
日期时间类型 一般用整型保存时间戳,因为PHP可以很方便的将时间戳进行格式化. datetime 8字节 日期及时间 1000-01-01 00:00:00 到 9999-12-31 23:59:59 ...
- git版本回退:git reset --hard 版本号
开发项目中会遇到各种奇葩的事情: 奇葩系列之在项目更新迭代开发正带劲的时候突然更新项目之前的项目出问题了要修复.在开发功能一半又要修复之前的问题着急上线的情况下.此时此刻git的版本回退是那么的迷人, ...
- ubuntu 20.04 基于kubeadm部署kubernetes 1.22.4集群—报错解决
一.添加node节点,报错1 注:可以提前在各node节点上修改好(无报错无需执行此项) yang@node2:~$ sudo kubeadm join 192.168.1.101:6443 --to ...
- Promise缺点
1.Promise 不能用try Catch捕获,只能通过.then的第二个参数或者.catch来捕获: let pro try{ pro = new Promise((resolve,reject) ...
- Vue常用组件,,,持续更新中
1.vue-lazyload :图片懒加载 2.vue-virtual-scroll-list 和 vue-virtual-scroller: 优化无限列表的场景 3.vue-table-with-t ...
- noi 1.1 2 输出第二个整数
描述 输入三个整数,把第二个输入的整数输出. 输入 只有一行,共三个整数,整数之间由一个空格分隔.整数是32位有符号整数. 输出 只有一行,一个整数,即输入的第二个整数. 样例输入 123 456 7 ...
- vmware workstation 16.x安装windows server 2012 R2无法点击安装vmware tools选项
在使用vmware workstation预设安装windows server 2012 R2后,提示需要先升级KBxxxxx更新才可以安装vmware tools,但是在安装了所需的更新后,发现菜单 ...
- 关于*p++的执行顺序
不确定*p++哪个优先级高了,想偷懒到百度找找解释,发现高赞的评论下也骂声一片,还是回头自己试试. 1 #include <iostream> 2 using namespace std; ...