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的服务。 主要功能包括:…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
stm32wle5 lpuart DMA数据不接收
配置波特率9600时,需要使用外部低速晶振...
