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自动按下脚本

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

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

相关文章

Java JDK 22全新发布 - 猫头虎博主带你一起深入了解JDK22!

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

消息队列RabbitMQ入门学习

目录 1.初识MQ 1.1.同步调用 1.2.异步调用 1.3.技术选型 2.RabbitMQ 2.1.收发消息 2.1.1.交换机 2.1.2.队列 2.1.3.绑定关系 2.1.4.发送消息 3.SpringAMQP 3.1WorkQueues模型 3.1.1消息接收 3.1.2测试 3.1.3.能者多劳 3.1.3.总结 3.2.交换机类型 3.3.Fanout交…

C++设计模式:门面模式(十二)

1、概念与定义 “接口隔离”模式&#xff1a;在组建构建过程中&#xff0c;某些接口之间直接的依赖常常会带来很多问题、甚至根本无法实现。采用添加一层间接&#xff08;稳定&#xff09;接口&#xff0c;来隔离本来相互紧密关联的接口是一种常见的解决方案。 门面设计模式定…

SpringCloud、SpringBoot、JDK版本对应关系

SpringCloud与SpringBoot 版本 官网说明&#xff1a;https://spring.io/projects/spring-cloud#overview SpringBoot 与 JDK版本关系 发布说明&#xff1a;https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Release-Notes SpringBoot 3.x不再支持JDK1.…

低空经济再火,通过了解飞行汽车产业链与核心技术,我发现了汽车行业从业者新的机会!

低空经济最近又一次成为资本市场热议的话题&#xff0c;同时在两会报告中大篇幅的写入低空经济&#xff0c;并将其定义成为“新质生产力的代表”&#xff0c;低空经济是什么&#xff1f;与我们此前所聊过的飞行汽车之间又有什么样子的联系&#xff1f;我们作为汽车行业的从业者…

Unity笔记之Android打包、减小包体之类的问题

打包问题 问题1&#xff1a; 一般大部分问题就是JDK、SDK、NDK之类的问题。现在是其他的问题&#xff0c;之前遇到过&#xff0c;好久没玩android了都忘了。 这试了半天&#xff0c;结果是需要有密钥库。那就给他创建一个填一下就行了 &#xff08;在网上看了半天&#xff…

Android 加密之 打包为arr 项目依赖或者为jar

Android 加密之 打包为arr 项目依赖或者为jar 1. 修改build.gradle plugins {//id com.android.application// 1. 修改为libraryid com.android.library }android {namespace com.dzq.iccid2compileSdk 33defaultConfig {//applicationId "com.dzq.iccid2"// 2. 注…

【数据结构】05树

树 树1.2 结点的分类1.3 结点间的关系1.4 树的其他概念1.5 树的性质 2. 二叉树2.1 满二叉树2.2 完全二叉树2.3 二叉排序树&#xff08;二叉查找树&#xff09; 3. 二叉树的存储结构3.1 二叉树顺序存储结构3.2 二叉树的链式存储结构 4. 二叉树的遍历4.1 层次遍历4.1 前序遍历4.2…

如何申请阿里云服务器学生优惠,入口在这呢!

阿里云学生服务器免费申请&#xff0c;之前是云翼计划学生服务器9元/月&#xff0c;现在是高校计划&#xff0c;学生服务器可以免费申请&#xff0c;先完成学生认证即可免费领取一台云服务器ECS&#xff0c;配置为2核2G、1M带宽、40G系统盘&#xff0c;在云服务器ECS实例过期之…

【C++】每日一题 14 最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 “”。 #include <iostream> #include <vector> #include <string>using namespace std;string longestCommonPrefix(vector<string>& strs) {if (…

Elasticsearch初步了解学习记录

目录 前言 一、ElasticSearch是什么&#xff1f; 二、使用步骤&#xff08;python版&#xff09; 1.引入包 2.连接数据库 3.创建索引 4.写入数据 5.查询数据 三、相关工具介绍 1.ES浏览器插件 总结 前言 随着数据量的不断增加&#xff0c;传统的查询检索在速度上遇…

IO——文件IO

1.1 概念 又称为系统IO&#xff0c;是系统调用&#xff0c;是操作系统提供的函数接口。 posix中定义的一组用于输入输出的函数。 1.2 特点 (1)没有缓冲机制&#xff0c;效率较低 (2)围绕文件标识符操作&#xff0c;非负整数&#xff0c;依次分配 (3) 文件IO默认打开了三个文…

正则表达式:量词(三)

正则表达式中的量词有以下几种:1. *: 匹配前面的字符0次或多次。2. : 匹配前面的字符1次或多次。3.?: 匹配前面的字符0次或1次。4. {n}: 匹配前面的字符恰好n次。5. {n,}: 匹配前面的字符至少n次。6. {n,m}:匹配前面的字符至少n次&#xff0c;但不超过m次。 以下是使用Python的…

计算机网络 子网掩码与划分子网

一、实验要求与内容 1、需拓扑图和两个主机的IP配置截图。 2、设置网络A内的主机IP地址为“192.168.班内学号.2”&#xff0c;子网掩码为“255.255.255.128”&#xff0c;网关为“192.168.班内学号.1”&#xff1b;设置网络B内的主机IP地址为“192.168.班内学号100.2”&#…

@AutoConfigurationPackage 和 @ComponentScan 有何区别?

首先&#xff0c;从名字上看&#xff0c;这两个注解意义特别接近&#xff0c;AutoConfigurationPackage 就是自动配置包&#xff0c;自动配置包的目的是能让系统扫描到包内的 Bean&#xff1b;ComponentScan 则是组件扫描&#xff0c;这个松哥在之前的教程中也多次提到过了&…

VBA 实现outlook 当邮件设置category: red 即触发自动创建jira issue

1. 打开: Outlook VBA&#xff08;Visual Basic for Applications&#xff09; 方法一: 在邮件直接搜索:Visual Basic editor 方法二: File -> Options -> Customize Ribbon-> 打钩 如下图: 2.设置运行VBA 脚本: File -> Options -> Trust center -> Trus…

R绘图保存eps,并且图例要求使用Times New Roman字体

目录 前言 方法&#xff1a; 一些失败的尝试&#xff1a; 前言 R绘图保存eps&#xff0c;并且图例要求使用Times New Roman字体&#xff1f;这个问题可以分解成以下两个小的问题&#xff1a; 如何实现使用R将绘制的图保存为eps格式&#xff1f;如何将R绘制的图中的图例使用…

Day37|贪心算法part06:738.单调递增的数字、968. 监控二叉树、贪心总结

738. 单调递增的数字 总体思想就是从后往前遍历&#xff0c;比较第i位和第i1位的大小&#xff0c;不符合顺序char[i]减1&#xff0c;i1位填9&#xff0c;找到需要填9的最先位置&#xff0c;然后填9。 class Solution {public int monotoneIncreasingDigits(int n) {String s …

kafka_2.11-2.4.1单机安装

kafka_2.11-2.4.1单机安装 下载 官网地址: http://kafka.apache.org/downloads.html # 2.11是scala的版本&#xff0c;2.4.1是kafka的版本 wget https://archive.apache.org/dist/kafka/2.4.1/kafka_2.11‐2.4.1.tgz 创建kafka相关目录 mkdir -p /usr/local/kafka/kafka_2.…

win 安装 Stable Diffusion

注&#xff1a;本人使用的是 RTX2060 - 6G版 特别提醒&#xff1a;安装一定要 CUDA 和 PyTorch 版本能配套用&#xff0c;不然会有生成保存问题(我是这样的)&#xff0c;装完用 python -m xformers.info 这个看对应的版本 建议&#xff1a;有些命令安装在venv 虚拟机中做&…