Qt/C++模拟鼠标键盘输入

1、控制鼠标移动

(1)Qt方案

QScreen* sc = QGuiApplication::primaryScreen();
QCursor* c = new QCursor();
int deltaX = 10;
int deltaY = 10;
c->setPos(sc, c->pos().x() + deltaX, c->pos().y() + deltaY);

(2)Windows原生方案(依赖WinUser.h)

方案1: 

int deltaX = 10;
int deltaY = 10;
POINT p;
GetCursorPos(&p);
SetCursorPos(p.x + deltaX, p.y + deltaY);

PS:用clipCursor函数可以限制光标范围 

方案2:

参考sendInput函数和其中需要用到的MOUSEINPUT结构体来实现,具体可以看:
sendInput 函数 (winuser.h) - Win32 apps | Microsoft Learn
MOUSEINPUT (winuser.h) - Win32 apps | Microsoft Learn

PS:该方法不指定MOUSEEVENTF_ABSOLUTE时鼠标是用的相对移动,运动速度受系统设置中“指针速度”的影响,因此会更加合理。

2、模拟鼠标/键盘输入

(1)Windows原生方案(依赖WinUser.h)

参考sendInput函数和其中需要用到的MOUSEINPUT结构体以及KEYBDINPUT结构体实现,下面是官方例程关于实现键盘输入的例子,实现了键盘Win+D回到桌面的功能:

INPUT inputs[4];
ZeroMemory(inputs, sizeof(inputs));
inputs[0].type = INPUT_KEYBOARD;
inputs[0].ki.wVk = VK_LWIN;
inputs[1].type = INPUT_KEYBOARD;
inputs[1].ki.wVk = 'D';
inputs[2].type = INPUT_KEYBOARD;
inputs[2].ki.wVk = 'D';
inputs[2].ki.dwFlags = KEYEVENTF_KEYUP;
inputs[3].type = INPUT_KEYBOARD;
inputs[3].ki.wVk = VK_LWIN;
inputs[3].ki.dwFlags = KEYEVENTF_KEYUP;
UINT uSent = SendInput(ARRAYSIZE(inputs), inputs, sizeof(INPUT));
if (uSent != ARRAYSIZE(inputs))
{OutputString(L"SendInput failed: 0x%x\n", HRESULT_FROM_WIN32(GetLastError()));
}

其中,uSent是函数返回成功插入键盘或鼠标输入流的事件数。如果函数返回零,则表示输入已被另一个线程阻止。若返回的事件数与发出的事件数不等,则有事件发送失败,使用GetLastError可以获取错误信息。

键盘、鼠标同理,参见:

sendInput 函数 (winuser.h) - Win32 apps | Microsoft Learn

KEYBDINPUT (winuser.h) - Win32 apps | Microsoft Learn

MOUSEINPUT (winuser.h) - Win32 apps | Microsoft Learn

3、请教一下

想请教一下路过的大佬,这种Qt的鼠标移动实现都是步进式的移动,如果要实现像鼠标或者摇杆一样的移动,应该怎么处理呢?难道用多线程?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/39857.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能发展方向的思考:简单与复杂的对立与融合

人工智能(AI)的迅猛发展,正在以惊人的速度改变着我们的世界。它在很多领域展示了强大的能力,特别是在处理简单、重复的任务方面,AI已经表现出极高的效率和准确性。然而,当面对复杂的业务场景时,…

660错题

不能局部求导,局部洛必达

Swift 中强大的 Key Paths(键路径)机制趣谈(上)

概览 小伙伴们可能不知道:在 Swift 语言中隐藏着大量看似“其貌不扬”实则却让秃头码农们“高世骇俗”,堪称卧虎藏龙的各种秘技。 其中,有一枚“不起眼”的小家伙称之为键路径(Key Paths)。如若将其善加利用&#xff…

Spring事务十种失效场景

首先我们要明白什么是事务?它的作用是什么?它在什么场景下在Spring框架下会失效? 事务:本质上是由数据库和程序之间交互的过程中的衍生物,它是一种控制数据的行为规则。有几个特性 1、原子性:执行单元内,要…

pjsip环境搭建、编译源码生成.lib库

使用平台: windows qt(5.15.2) vs(2019)x86 pjsip版本以及第三方库使用 pjsip 2.10 ffmpeg4.2.1 sdl2.0.12pjsip源码链接: https://github.com/pjsip/pjproject源码环境配置 首先创建两个文件夹,分别是include、lib其中include放置ff…

p2p、分布式,区块链笔记: 通过libp2p的Kademlia网络协议实现kv-store

Kademlia 网络协议 Kademlia 是一种分布式哈希表协议和算法,用于构建去中心化的对等网络,核心思想是通过分布式的网络结构来实现高效的数据查找和存储。在这个学习项目里,Kademlia 作为 libp2p 中的 NetworkBehaviour的组成。 以下这些函数或…

Java8 - Stream API 处理集合数据

Java 8的Stream API提供了一种功能强大的方式来处理集合数据,以函数式和声明式的方式进行操作。Stream API允许您对元素集合执行操作,如过滤、映射和归约,以简洁高效的方式进行处理。 下面是Java 8 Stream API的一些关键特性和概念&#xff…

windows安装Gitblit还是Bonobo Git Server

Gitblit 和 Bonobo Git Server 都是用于托管Git仓库的工具,但它们是基于不同平台的不同软件。 Gitblit 是一个纯 Java 写的服务器,支持托管 Git,Mercurial 和 SVN 仓库。它需要 Java 运行环境,适合在 Windows、Linux 和 Mac 平台…

Android 输入系统 InputStage

整体流程如上所说,简要归纳如下: 输入法之前的处理 输入法处理 输入法之后处理 综合处理 InputStage将输入事件的处理分成若干个阶段(Stage), 如果当前有输入法窗口,则事件处理从 NativePreIme 开始,否…

SpringBoot MongoTemplate使用详解

前面文章讲了 SpringBoot整合MongoDB JPA使用:https://blog.csdn.net/qq_42402854/article/details/139973336 在项目中,通常会 JPA语法与 MongoTemplate两者结合使用,特别是针对复杂动态条件查询时,MongoTemplate更加友好。 Spr…

主流国产服务器操作系统技术分析

主流国产服务器操作系统 信创 "信创",即信息技术应用创新,作为科技自立自强的核心词汇,在我国信息化建设的进程中扮演着至关重要的角色。自2016年起步,2020年开始蓬勃兴起,信创的浪潮正席卷整个信息与通信技…

GNeRF代码复现

https://github.com/quan-meng/gnerf 之前一直去复现这个代码总是文件不存在,我就懒得搞了(实际上是没能力哈哈哈) 最近突然想到这篇论文重新试试复现 一、按步骤创建虚拟环境安装各种依赖等 二、安装好之后下载数据,可以用Blen…

virtualbox+Ubuntu部分窗口显示错乱

如下图: 窗口标题显示错乱,跟一般乱码不一样。 解决办法: 在virtualbox设置中,显示选项卡,取消勾选启用3D加速 也可参考此链接:linux ubuntu 中vscode中央窗口显示出现异常/显示错误_开发工具-CSDN问答

打卡第一天

今天是参加算法训练营的第一天,希望我能把这个训练营坚持下来,希望我的算法编程题的能力有所提升,不再面试挂了,面试总是挂编程题,记录我leetcode刷题数量: 希望我通过这个训练营能够实现两份工作的无缝衔接…

自动化任务工具 -- zTasker v1.94 绿色版

软件简介 zTasker 是一款功能强大的自动化任务管理软件,以其简洁易用、一键式操作而著称。软件体积小巧,启动迅速,提供了超过100种任务类型和30多种定时/条件执行方法,能够满足用户在自动化方面的多样化需求。 zTasker 支持定时任…

从全连接到卷积

一、全连接到卷积 1、卷积具有两个原则: 平移不变性:无论作用在哪个部分,它都要有相同的作用,而不会随着位置的改变而改变 局部性:卷积核作用处,作用域应该是核作用点的周围一小部分而不作用于更大的部分 …

OBD诊断(ISO15031) 04服务

文章目录 功能简介ISO 9141-2、ISO 14230-4和SAE J1850的诊断服务定义1、清除/重置与排放相关的诊断信息请求消息定义2、请求与排放相关的DTC响应消息定义3、报文示例 ISO 15765-4的诊断服务定义1、请求与排放相关的DTC请求消息定义2、请求与排放相关的DTC响应消息定义3、否定响…

专题二:Spring源码编译

目录 下载源码 配置Gradle 配置环境变量 配置setting文件 配置Spring源码 配置文件调整 问题解决 完整配置 gradel.properties build.gradle settiings.gradel 在专题一: Spring生态初探中我们从整体模块对Spring有个整体的印象,现在正式从最…

基于Hadoop平台的电信客服数据的处理与分析③项目开发:搭建基于Hadoop的全分布式集群---任务6:安装并配置Hadoop

任务描述 项目的运行环境为基于Hadoop的全分布式模式集群。 任务的主要内容为安装Hadoop分布式集群环境。 任务指导 Hadoop集群需要整个集群所有节点安装的Hadoop版本保持一致,并且拥有相同的配置 具体配置步骤如下: 1. 解压缩Hadoop的压缩包 2. …

AI产品经理需要哪些必备技能?如何成为AI产品经理?

1.AI产品经理是什么 回答这个问题前我们首先得理清楚什么是AI产品经理,它和传统的互联网产品经理有什么区别。 1.1 AI产品经理职责 主要职责一方面是规划如何将成熟的AI技术应用在各个领域不同场景中,提升原有场景的效率或效果等;另一方面…