QT写Windows按键输出(外挂)
一、前言
玩游戏的时候遇到些枯燥无味反反复复的按鼠标键盘的情况时,就想写个外挂自动释放。刚好在学qt所以试验了下QT能不能对外输出按键与鼠标。
二、思路
qt中的按键鼠标全是输入,没有直接对外输出键盘鼠标指令的类,但是我们换个思路,我们可以给Windows发送信号,让Windows发送虚拟的键盘指令,即直接调用Windows的api接口。
三、代码实现(键盘为例)
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QTimer>
#include <QDebug>
#include <QKeyEvent>#ifdef Q_OS_WIN
#include <windows.h>
#endifQT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;QTimer* m_timer_0;QTimer* m_timer_1;void sendKeyboardInput(Qt::Key key, bool isKeyDown = true);protected:virtual void keyPressEvent(QKeyEvent *event);
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);m_timer_0 = new QTimer;m_timer_1 = new QTimer;connect(m_timer_0, &QTimer::timeout, this, [=](){sendKeyboardInput(Qt::Key_F2);qDebug() << "Press F2";m_timer_1->start(500);});connect(m_timer_1, &QTimer::timeout, this, [=](){sendKeyboardInput(Qt::Key_F1);qDebug() << "Press F1";m_timer_1->stop();});connect(ui->pushButton, &QPushButton::clicked, this, [=](){m_timer_0->start(1000);});connect(ui->pushButton_2, &QPushButton::clicked, this, [=](){m_timer_0->stop();});
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::sendKeyboardInput(Qt::Key key, bool isKeyDown)
{
#ifdef Q_OS_WININPUT input = {};input.type = INPUT_KEYBOARD;unsigned short keyAddr;if(key == Qt::Key_F1){keyAddr = 0x70;}else if(key == Qt::Key_F2){keyAddr = 0x71;}else{keyAddr = key;}// 获取Virtual Key Code
// input.ki.wVk = static_cast<WORD>(key + 0x100); // 加0x100表示非扫描码input.ki.wVk = static_cast<WORD>(keyAddr + 0x100); // 加0x100表示非扫描码// 设置按键状态(按下或释放)input.ki.dwFlags = isKeyDown ? 0 : KEYEVENTF_KEYUP;// 发送模拟的键盘事件SendInput(1, &input, sizeof(input));
#elseQ_UNUSED(key);Q_UNUSED(isKeyDown);qWarning() << "sendKeyboardInput() is only supported on Windows.";
#endif
}void MainWindow::keyPressEvent(QKeyEvent *event)
{if(event->key() == Qt::Key_Escape){m_timer_0->stop();}else if (event->key() == Qt::Key_Space){m_timer_0->start(1000);}
}
四、代码分析
自动按键盘等自动释放需要使用qtimer来实现,Windows的api使用时需要添加Windows的头文件。至于鼠标和键盘的事件,在这就不在讲解,资料很多自己学习即可,记得重构就行。
这里有个注意事项,Windows API中,Virtual Key Code(VK Code)键盘按键对应的值和QT中键盘按键枚举的值是不一样的,如果要用的键盘按键多的话,最好映射一下地址,我做实验就没写映射。下述为Virtual Key Code(VK Code)键盘按键对应的值:
#define VK_LBUTTON 0x01 // 左鼠标按钮
#define VK_RBUTTON 0x02 // 右鼠标按钮
#define VK_CANCEL 0x03 // 控制-break 终止符
#define VK_MBUTTON 0x04 // 中间鼠标按钮(如果存在的话)
#define VK_BACK 0x08 // Backspace 键
#define VK_TAB 0x09 // Tab 键
#define VK_CLEAR 0x0C // Clear 键
#define VK_RETURN 0x0D // Enter 键
#define VK_SHIFT 0x10 // Shift 键
#define VK_CONTROL 0x11 // Ctrl 键
#define VK_MENU 0x12 // Alt 键
#define VK_PAUSE 0x13 // Pause 键
#define VK_CAPITAL 0x14 // Caps Lock 键
#define VK_KANA 0x15 // IME Kana 模式(日语输入法)
#define VK_HANGEUL 0x15 // IME Hangul 模式(韩语输入法)
#define VK_HANGUL 0x15 // IME Hangul 模式(韩语输入法)
#define VK_JUNJA 0x17 // IME Junja 模式
#define VK_FINAL 0x18 // IME Final 模式
#define VK_HANJA 0x19 // IME Hanja 模式(韩语输入法)
#define VK_KANJI 0x19 // IME Kanji 模式(日语输入法)
#define VK_ESCAPE 0x1B // Esc 键
#define VK_CONVERT 0x1C // IME Convert 键
#define VK_NONCONVERT 0x1D // IME NonConvert 键
#define VK_ACCEPT 0x1E // IME Accept 键
#define VK_MODECHANGE 0x1F // IME Mode Change 请求
#define VK_SPACE 0x20 // Space 键
#define VK_PRIOR 0x21 // Page Up 键
#define VK_NEXT 0x22 // Page Down 键
#define VK_END 0x23 // End 键
#define VK_HOME 0x24 // Home 键
#define VK_LEFT 0x25 // Left Arrow 键
#define VK_UP 0x26 // Up Arrow 键
#define VK_RIGHT 0x27 // Right Arrow 键
#define VK_DOWN 0x28 // Down Arrow 键
#define VK_SELECT 0x29 // Select 键
#define VK_PRINT 0x2A // Print 键
#define VK_EXECUTE 0x2B // Execute 键
#define VK_SNAPSHOT 0x2C // Print Screen 键
#define VK_INSERT 0x2D // Insert 键
#define VK_DELETE 0x2E // Delete 键
#define VK_HELP 0x2F // Help 键// 数字键区(小键盘)
#define VK_0 0x30
#define VK_1 0x31
// ...(省略其他数字键)
#define VK_9 0x39// 字母键区
#define VK_A 0x41
#define VK_B 0x42
// ...(省略其他字母键)
#define VK_Z 0x5A// 专用字符键
#define VK_LWIN 0x5B // 左 Windows 键
#define VK_RWIN 0x5C // 右 Windows 键
#define VK_APPS 0x5D // 应用程序键(菜单键)
#define VK_SLEEP 0x5F // 电脑休眠键// 数字键区(小键盘)
#define VK_NUMPAD0 0x60
#define VK_NUMPAD1 0x61
// ...(省略其他数字键)
#define VK_NUMPAD9 0x69// 数字键区附加键
#define VK_MULTIPLY 0x6A // *
#define VK_ADD 0x6B // +
#define VK_SEPARATOR 0x6C // 通常为小数点 .
#define VK_SUBTRACT 0x6D // -
#define VK_DECIMAL 0x6E // 小数点 .
#define VK_DIVIDE 0x6F // /// 功能键区(F1到F12)
#define VK_F1 0x70
#define VK_F2 0x71
// ...(省略其他功能键)
#define VK_F12 0x7B// 其他键
#define VK_LSHIFT 0xA0 // 左 Shift 键
#define VK_RSHIFT 0xA1 // 右 Shift 键
#define VK_LCONTROL 0xA2 // 左 Ctrl 键
#define VK_RCONTROL 0xA3 // 右 Ctrl 键
#define VK_LMENU 0xA4 // 左 Alt 键
#define VK_RMENU 0xA5 // 右 Alt 键
还有一点就是,如果不想那么快被封号,timer时间不要写那么死,搞个随机数时间,区间范围内随机触发。
五、视频演示
F2F1自动按下脚本
相关文章:
QT写Windows按键输出(外挂)
一、前言 玩游戏的时候遇到些枯燥无味反反复复的按鼠标键盘的情况时,就想写个外挂自动释放。刚好在学qt所以试验了下QT能不能对外输出按键与鼠标。 二、思路 qt中的按键鼠标全是输入,没有直接对外输出键盘鼠标指令的类,但是我们换个思路&…...
Stable Diffusion之文生图模型训练
1、数据准备 提前准备好一组相关的照片。 在线的图片处理网站 BIRME - Bulk Image Resizing Made Easy 2.0 (Online & Free) 将图片转成统一大小,支持批量处理,效率高 2、生成提示词 进入stable diffusion webui页面 旧版直接使用 train/proproc…...
SpringBoot整合支付宝沙箱支付
环境说明:SpringBoot3.0.2 支付宝沙箱地址:沙箱地址 获取配置信息 因支付需要回调地址,回调地址必须是公网,如果有公网的话,那直接在下面配置文件填写自己的公网,没有的话,就需要我们借助第三…...
探索进程控制第一弹(进程终止、进程等待)
文章目录 进程创建初识fork函数fork函数返回值fork常规用法fork调用失败的原因 写时拷贝进程终止进程终止是在做什么?进程终止的情况代码跑完,结果正确/不正确代码异常终止 如何终止 进程等待概述进程等待方法wait方法waitpid 进程创建 初识fork函数 在…...
在mac环境下使用shell脚本实现tree命令
文章目录 使用ls实现tree使用find实现tree 使用ls实现tree 实现思路 使用ls -F 打印文件类型,如果是目录后面跟/,如果是可执行文件后面跟*;使用grep -v /$ 筛选文件排除目录,-v为反向筛选;使用grep /$ 仅筛选目录&am…...
递归时间复杂度分析方法:Master 定理
编写算法时,可能因为对自己代码的复杂度的不清晰而导致错失良机,对于普通的递推或者说循环的代码,仅用简单的调和级数或者等差数列和等比数列即可分析,但是对于递归的代码,简单的递归树法并不方便,理解并记…...
实例名不规范导致mds创建失败
概述 在部署ceph集群时,规划主机名、关闭防火墙、配置免密、关闭selinux,配置hosts文件这几步同样重要,都是初期部署一次麻烦,方便后续运维的动作。遇到过很多前期稀里糊涂部署,后续运维和配置时候各种坑。 近期遇到…...
OpenGL中的纹理过滤GL_NEAREST和GL_LINEAR
一、GL_NEAREST(最近邻插值) 1.1 原理 当需要从纹理中采样颜色时,GL_NEAREST模式会选择离采样点最近的纹理像素(通常是最接近采样点的纹理元素的中心),并直接使用该像素的颜色值作为输出。这种模式不进行任…...
vue 性能优化
data 层级不要太深 data 层级太深会增加响应式监听的计算,导致页面初次渲染时卡顿。 合理使用 v-show 和 v-if 频繁切换时,使用 v-show无需频繁切换时,使用 v-if 合理使用 computed computed 有缓存,data 不变时不会重新计算&…...
互联网大厂ssp面经(操作系统:part1)
1. 什么是进程和线程?它们之间有什么区别? a. 进程是操作系统中运行的一个程序实例。它拥有独立的地址空间和资源,可以独立执行。 b. 线程是进程内的一个执行单元,一个进程可以包含多个线程。 c. 线程共享进程的资源,…...
Android Activity 启动涉及几个进程
Zygote进程: Zygote进程在Android系统启动时被初始创建,并且初始化了虚拟机(Dalvik或ART),预加载了Android系统的核心类库。所有的Android应用进程都是通过fork()从Zygote进程派生出来的,这允许应用快速启动࿰…...
说说你对链表的理解?常见的操作有哪些?
一、是什么 链表(Linked List)是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的,由一系列结点(链表中每一个元素称为结点)组成 每个结点包括两个部分&…...
每天五分钟深度学习:逻辑回归算法的损失函数和代价函数是什么?
本文重点 前面已经学习了逻辑回归的假设函数,训练出模型的关键就是学习出参数w和b,要想学习出这两个参数,此时需要最小化逻辑回归的代价函数才可以训练出w和b。那么本节课我们将学习逻辑回归算法的代价函数是什么? 为什么不能平方差损失函数 线性回归的代价函数我们使用…...
llama-factory SFT系列教程 (二),大模型在自定义数据集 lora 训练与部署
文章目录 简介支持的模型列表2. 添加自定义数据集3. lora 微调4. 大模型 lora 权重,部署问题 参考资料 简介 文章列表: llama-factory SFT系列教程 (一),大模型 API 部署与使用llama-factory SFT系列教程 (二),大模型在自定义数…...
C语言游戏实战(11):贪吃蛇大作战(多人对战)
成果展示: 贪吃蛇(多人对战) 前言: 这款贪吃蛇大作战是一款多人游戏,玩家需要控制一条蛇在地图上移动,吞噬其他蛇或者食物来增大自己的蛇身长度和宽度。本游戏使用C语言和easyx图形库编写,旨在…...
腾讯测试岗位的面试经历与经验分享【一面、二面与三面】
腾讯两个月的实习一转眼就结束了,回想起当时面试的经过,感觉自己是跌跌撞撞就这么过了,多少有点侥幸.马上腾讯又要来校招了,对于有意愿想投腾讯测试岗位的同学们,写了一些那时候面试的经历和自己的想法,算不上经验,仅供参考吧! 一面 — —技术基础,全面…...
手机移动端网卡信息获取原理分析
有些场景我们需要获取当前手机上的网卡信息(如双卡双待、Wifi等)。本文准备研究一下这块的原理,以便更好的掌握相关技术原理。 1、底层系统接口 getifaddrs 使用 getifaddrs 接口可以达到我们的目的,该接口会返回本地所有网卡的信…...
无人新零售引领的创新浪潮
无人新零售引领的创新浪潮 在数字化时代加速演进的背景下,无人新零售作为商业领域的一股新兴力量,正以其独特的高效性和便捷性重塑着传统的购物模式,开辟了一条充满创新潜力的发展道路。 依托人脸识别、物联网等尖端技术,无人新…...
SD-WAN提升企业网络体验
在现代企业中,网络体验已成为提升工作效率与业务质量的关键因素。SD-WAN技术的出现,以其独特的优势,为企业提供了优化网络连接、加速数据传输、提升服务质量和应用访问体验,以及增强网络稳定性的解决方案。接下来,我们…...
Docker搭建Let‘s Encrypt
Let’s Encrypt是一个免费、开放和自动化的证书颁发机构(CA),它提供了一种简单、无需重复的机制来获取和更新SSL/TLS证书。Let’s Encrypt Docker镜像允许用户在容器化环境中轻松部署和使用Let’s Encrypt的服务。 主要功能包括:…...
单链表讲解
一.链表的概念以及结构 链表是一种物理结构上不连续,逻辑结构上连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 链表的结构与火车是类似的,一节一节的,数据就像乘客一样在车厢中一样。 与顺序表不同的…...
DFS算法系列 回溯
DFS算法系列-回溯 文章目录 DFS算法系列-回溯1. 算法介绍2. 算法应用2.1 全排列2.2 组合2.3 子集 3. 总结 1. 算法介绍 回溯算法是一种经典的递归算法,通常被用来解决排列问题、组合问题和搜索问题 基本思想 从一个初始状态开始,按一定的规则向前搜索&…...
Linux C应用编程:MQTT物联网
1 MQTT通信协议 MQTT(Message Queuing Telemetry Transport,消息队列遥测传 输)是一种基于客户端-服务端架构的消息传输协议,如今,MQTT 成为了最受欢迎的物联网协议,已广泛应用于车联网、智能家居、即时聊…...
企业常用Linux文件命令相关知识+小案例
远程连接工具无法连接VMWARE: 如果发现连接工具有时连不上,ip存在,这时候我们查看网络编辑器,更多配置,看vnet8是不是10段,nat设置是否是正确的? 软件重启一下虚机还原一下网络编辑器 查看文件…...
Istio介绍
1.什么是Istio Istio是一个开源的服务网格(Service Mesh)框架,它提供了一种简单的方式来为部署在Kubernetes等容器编排平台上的微服务应用添加网络功能。Istio的核心功能包括: 服务治理:Istio能够帮助管理服务之间的…...
代码随想录算法训练营第四十七天|leetcode115、392题
一、leetcode第392题 本题要求判断s是否为t的子序列,因此设置dp数组,dp[i][j]的含义是下标为i-1的子串与下标为j-1的子串相同字符的个数,可得递推公式是通过s[i-1]和t[j-1]是否相等区分。 具体代码如下: class Solution { publ…...
将Ubuntu18.04默认的python3.6升级到python3.8
1、查看现有的 python3 版本 python3 --version 2、安装 python3.8 sudo apt install python3.8 3、将 python3.6 和 3.8 添加到 update-alternatives sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 1 sudo update-alternatives --insta…...
Python和Java哪个更适合后端开发?
Python和Java都是强大的后端开发语言,它们各自有鲜明的特点和适用场景。选择哪一个更适合后端开发,主要取决于具体的项目需求、团队技术栈、个人技能偏好以及长期发展考虑等因素。 下面是两者在后端开发中的优势和劣势: 「Python࿱…...
Python+pytest接口自动化之cookie绕过登录(保持登录状态)
前言 我们今天来聊聊pythonpytest接口自动化之cookie绕过登录(保持登录状态),在编写接口自动化测试用例或其他脚本的过程中,经常会遇到需要绕过用户名/密码或验证码登录,去请求接口的情况,一是因为有时验证…...
什么数据集成(Data Integration):如何将业务数据集成到云平台?
说到数据集成(Data Integration),简单地将所有数据倒入数据湖并不是解决办法。 在这篇文章中,我们将介绍如何轻松集成数据、链接不同来源的数据、将其置于合适的环境中,使其具有相关性并易于使用。 数据集成࿱…...
需要做网站的公司/百度推广优化师培训
双击 shift ,输入 eslint ,点击 fix eslint problems idea 修复文件的 eslint...
合肥网站建设是什么意思/全媒体广告代理加盟
Shiro基础身份验证 如果要进行shiro的日志信息读取,那么需要使用一个org.apache.shiro.util.Factory接口,在这个接口里面定义有一 取得SecuruityManager接口对象的方法:public T getInstance(); Factory是接口,本次将通…...
西安双语网站建设/搜索引擎优化的定义
为什么会有模块 我们最初只会有index.js的文件,后来随着业务的发展,这个代码发展到了1000多行,就很难读懂并且很难维护了了,因此我们就想到了分块,就是把相同业务逻辑的代码放在一起,这个就是模块.通常是会…...
在线手机网站建设/站长网站工具
detectjQuery代码段,用于在启用条款和条件复选框之前检测用户是否已滚动到页面底部(或带滚动的div)。 Terms of service jargon stuff hereI accept the blah, blah, blah.jQuery(document).ready(function() {jQuery("input#TERMS_ACC…...
锚文本对网站/教育培训机构网站
css: 层叠样式表 作用: 渲染页面 提供工作效率,将html和样式分离 和html的整合 方式1:内联样式表 通过标签的style属性 <xxx style"..."/> 方式2:内部样式表 通过head的子标签Style子标…...
著名办公室装修公司/关键词优化软件哪家好
简单工厂模式 在工厂类中通过方法(传入参数)来创建对象。 优点: 1. 使客户端与具体实现解耦 2. 对于创建某些创造过程复杂的对象,直接将创建交给工厂 缺点: 1. 新增类需要修改工厂类中代码,不符合开闭原则 …...