Qt使用API实现鼠标点击操作 您所在的位置:网站首页 autohotkey鼠标点击坐标 Qt使用API实现鼠标点击操作

Qt使用API实现鼠标点击操作

2023-03-14 08:06| 来源: 网络整理| 查看: 265

前段时间,工作需要进行数据录入,每次都要点击3次按钮,想让鼠标自行点击,只要下位机接入,就自动点击按钮把数据读出,录入到服务端,并且进行检测,说干就干,没有经验,那只有面向百度编程.

根据查到的资料,可以使用WinAPI进行鼠标模似.可以使用的函数有两个,一个是SendMessageA(),一个是mouse_evnet();进行鼠标操作的模似;

SendMessageA()的参数说明:

LRESULT SendMessageA( [in] HWND hWnd, [in] UINT Msg, [in] WPARAM wParam, [in] LPARAM lParam );

hWnd:指定要接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。

Msg:指定被发送的消息。

wParam:指定附加的消息特定信息。

IParam:指定附加的消息特定信息。

返回值:返回值指定消息处理的结果,依赖于所发送的消息。

备注:需要用HWND_BROADCAST通信的应用程序应当使用函数RegisterWindowMessage来为应用程序间的通信取得一个唯一的消息。

如果指定的窗口是由正在调用的线程创建的,则窗口程序立即作为子程序调用。如果指定的窗口是由不同线程创建的,则系统切换到该线程并调用恰当的窗口程序。线程间的消息只有在线程执行消息检索代码时才被处理。发送线程被阻塞直到接收线程处理完消息为止。

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 );

dwFlags

标志位集,指定点击按钮和鼠标动作的多种情况。此参数可以是下列值的某种组合:

名称

说明

MOUSEEVENTF_ABSOLUTE

dX和dY参数含有规范化的绝对坐标。如果不设置,这些参数含有相对数据:相对于上次位置的改动位置。此标志可设置,也可不设置,不管鼠标的类型或与系统相连的类似于鼠标的设备的类型如何。要得到关于相对鼠标动作的信息,参见下面备注部分。

MOUSEEVENTF_MOVE

这表示鼠标移动

MOUSEEVENTF_LEFTDOWN

这表示鼠标左键按下

MOUSEEVENTF_LEFTUP

这表示鼠标左键松开

MOUSEEVENTF_RIGHTDOWN

这表示鼠标右键按下

MOUSEEVENTF_RIGHTUP

这表示鼠标右键松开

MOUSEEVENTF_MIDDLEDOWN

这表示鼠标中键按下

MOUSEEVENTF_MIDDLEUP

这表示鼠标中键松开

MOUSEEVENTF_WHEEL

这表示鼠标轮被滚动,如果鼠标有一个滚轮。滚动的数量由dwData给出。

dx

指定鼠标沿x轴的绝对位置或者从上次鼠标事件产生以来移动的数量,依赖于MOUSEEVENTF_ABSOLUTE的设置。给出的绝对数据作为鼠标的实际X坐标;给出的相对数据作为移动的mickeys数。一个mickey表示鼠标移动的数量,表明鼠标已经移动。

dy

指定鼠标沿y轴的绝对位置或者从上次鼠标事件产生以来移动的数量,依赖于MOUSEEVENTF_ABSOLUTE的设置。给出的绝对数据作为鼠标的实际y坐标,给出的相对数据作为移动的mickeys数。

dwData

如果dwFlags为MOUSEEVENTF_WHEEL,则dwData指定鼠标轮移动的数量。正值表明鼠标轮向前转动,即远离用户的方向;负值表明鼠标轮向后转动,即朝向用户。一个轮击定义为WHEEL_DELTA,即120。如果dwFlagsS不是MOUSEEVENTF_WHEEL,则dWData应为零。

dwExtralnfo

指定与鼠标事件相关的附加32位值。应用程序调用函数GetMessageExtraInfo来获得此附加信息。

简单的翻译一下上在面的说明就是SendMessageA()可以用来发送任何消息,包括鼠标消息,发送的时候,有返回值,非0就是成功.但是此函数发送鼠标消息的时候不需要控制鼠标.

而mouse_evnet(),则需要控制鼠标移动到目标上操作.

好处是,SendMessageA()是相当于后台操作,属于是静默型,而mouse_evnet()则需要控制鼠标实际移动,也就是你使用了这个,任务没有安成前,你是无法使用鼠标的.

OK,了解了具体的函数之后,开始准备编写代码.经过测试

SendMessageA()需要传入组件的句柄,才可以进行消息传递,(经过测试,使用相对坐标,无法无成消息传递),

使用举例:SendMessageA(hwind,msg,wParam,lParam);

hwind:指的是窗口句柄,也就是窗口的唯一标识号,你要在哪个窗口传递消息,就指定窗口句柄即可.

msg:消息类型,指的是,你要给指定口传递什么消息.

wParam:消息附加说明,此处可以填写0,或者指定说明

lParam:组件句柄(这里貌似只能填写句柄,填写相对坐标是无法成功的个人已经测试验证)

Qt中使用方式:

//使用此函数,必须引入windows.h头文件 #include   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() 获取分辨率的函数

思路:首先你需要获取组件在窗口上的相对坐标,然后再进行点击,这是因为,组件相对于窗口,这个坐标是恒定不变的,变化的只是窗口本身在桌面的位置,获取窗口在桌面的位置,需要先获取当前显示器的分辨率

这其中还有一个缩放比的问体,就是用户把窗体的大小改变了一点,此时,就需要重新计算了,我为了实现基本功能,把窗体的大小进行了固定,所以就规避了计算缩放比的问题.

brEnumDisplaySettings()br获取分辨率的函数

第一步我们需要获取这个目标窗口

使用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已经测试成功。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有