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的服务。 主要功能包括:…...
4重防护构建安卓安全屏障:APKMirror应用管理全攻略
4重防护构建安卓安全屏障:APKMirror应用管理全攻略 【免费下载链接】APKMirror 项目地址: https://gitcode.com/gh_mirrors/ap/APKMirror 在安卓应用下载的数字丛林中,恶意软件如同潜伏的猎手,时刻准备利用用户对新版本的渴望发起攻击…...
OpenClaw负载均衡:多Qwen3-VL:30B实例轮询策略
OpenClaw负载均衡:多Qwen3-VL:30B实例轮询策略 1. 为什么需要多模型实例负载均衡 上周我遇到一个棘手问题:用OpenClaw处理批量图片分析任务时,单个Qwen3-VL:30B实例频繁触发速率限制,导致任务队列堆积。更糟的是,有次…...
OpenClaw内存优化:GLM-4.7-Flash大任务处理的资源调配技巧
OpenClaw内存优化:GLM-4.7-Flash大任务处理的资源调配技巧 1. 当OpenClaw遇上大任务:我的内存崩溃现场 那是个周五的深夜,我正尝试用OpenClaw自动处理一批技术文档的归档和摘要生成。任务看似简单:读取200多个Markdown文件&…...
Midjourney 图像到图像转换:真实人物与动漫的一致性与多样场景选择
Midjourney 拥有强大的图像到图像转换能力。本文将手把手教你如何在我们的 AceDataCloud 网站 上将照片切换到任何动漫场景,同时保持角色的一致性。 通过以下步骤,我们可以轻松实现角色一致性。 接下来,我们看一下效果,原始图像如…...
Windows资源管理器终极美化指南:一键添加惊艳毛玻璃效果
Windows资源管理器终极美化指南:一键添加惊艳毛玻璃效果 【免费下载链接】ExplorerBlurMica Add background Blur effect or Acrylic (Mica for win11) effect to explorer for win10 and win11 项目地址: https://gitcode.com/gh_mirrors/ex/ExplorerBlurMica …...
ViGEmBus虚拟手柄驱动:Windows内核级游戏控制器模拟核心技术解析与应用指南
ViGEmBus虚拟手柄驱动:Windows内核级游戏控制器模拟核心技术解析与应用指南 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus ViGEmBus作为Windows…...
vLLM-v0.17.1入门必看:从零部署支持多LoRA的开源推理框架
vLLM-v0.17.1入门必看:从零部署支持多LoRA的开源推理框架 1. vLLM框架简介 vLLM是一个专为大型语言模型(LLM)设计的高性能推理和服务库,最新发布的v0.17.1版本带来了多项重要改进,特别是增强了对多LoRA适配器的支持。这个开源项目最初由加州…...
PotPlayer跨语言字幕解决方案:基于百度翻译API的实时字幕转换工具
PotPlayer跨语言字幕解决方案:基于百度翻译API的实时字幕转换工具 【免费下载链接】PotPlayer_Subtitle_Translate_Baidu PotPlayer 字幕在线翻译插件 - 百度平台 项目地址: https://gitcode.com/gh_mirrors/po/PotPlayer_Subtitle_Translate_Baidu 在全球化…...
实战演练:在快马平台模拟静电地板排布与支架系统配置方案
今天想和大家分享一个特别实用的工具——在InsCode(快马)平台上快速搭建的静电地板施工模拟器。作为机房建设中的重要环节,静电地板施工的合理规划直接影响后期使用效果。这个工具能帮我们在实际施工前,通过可视化模拟规避很多潜在问题。 核心功能设计思…...
如何在日常渗透中实现通杀漏洞挖掘
如何在日常渗透中实现通杀漏洞挖掘 你是不是天天遇到了edu刷屏?看到了某些漏洞平台,某些人交了一千个公益漏洞?是不是觉得很牛逼?其实不然,都不难,其实如果我要是想刷这玩意,可以交不完的漏洞&a…...
