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>
#endif

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    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_WIN
    INPUT 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));
#else
    Q_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自动按下脚本

### 回答1: QT是一个跨平台的应用程序开发框架,提供了丰富的类库和工具,方便开发者快速构建各种类型的应用程序。USB HID(Human Interface Device)是一种USB设备的通信协议,用于连接和传输人机交互设备,如键盘、鼠标、游戏手柄等。 在QT中,可以使用usbhid库来实现USB HID设备的读操作。使用usbhid库,首先需要创建一个QHidDevice对象,并设置设备的读权限。然后,可以使用open()函数打开设备,读取和入数据。读取数据可以使用read()函数,入数据可以使用write()函数。在读取和入数据之前,需要设置输入输出报告的宽度和长度。 使用QT的usbhid实例,可以方便地与USB HID设备进行通信。可以通过读取设备数据,获取设备状态和传感器信息。也可以通过入设备数据,发送指令和控制设备的运行。通过QT的信号和槽机制,可以实现与设备的实时交互和数据更新。 使用qt usbhid实例的一个应用场景是通过USB HID设备控制机器人的移动。通过读取设备的按钮状态和摇杆信息,获取用户的输入命令。然后,将命令发送给机器人,控制机器人的运动方向和速度。通过qt usbhid实例,可以方便地实现与机器人的通信和控制。 总之,qt usbhid实例是基于QT框架实现USB HID设备通信的示例程序。通过这个示例,开发者可以学习和了解如何使用QT框架连接和操作USB HID设备,从而应用到各种实际开发中。 ### 回答2: 在Qt中,使用usbhid库可以实现USB设备的数据交互。下面是一个Qt usbhid库的实例说明。 首先,需要在Qt项目中包含usbhid库。可以通过在.pro文件中添加一行代码来引入这个库: LIBS += -lusb-1.0 接下来,就可以在代码中使用usbhid库来进行USB设备的数据交互了。以下是一个简单的例子: ``` #include <QCoreApplication> #include <usbhid.h> #include <iostream> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 打开USB设备 UsbHid hid; if (!hid.open(0x1234, 0x5678)) { std::cout << "无法打开USB设备" << std::endl; return -1; } // 发送数据 unsigned char sendData[64] = {0x00, 0x01, 0x02, 0x03}; if (!hid.write(sendData, sizeof(sendData))) { std::cout << "发送数据失败" << std::endl; hid.close(); return -1; } // 接收数据 unsigned char recvData[64]; int bytesRead = hid.read(recvData, sizeof(recvData)); if (bytesRead < 0) { std::cout << "接收数据失败" << std::endl; hid.close(); return -1; } // 输出接收到的数据 for (int i = 0; i < bytesRead; i++) { std::cout << "接收到的数据:" << recvData[i] << std::endl; } // 关闭USB设备 hid.close(); return a.exec(); } ``` 以上代码先通过open函数打开指定的USB设备,然后通过write函数发送数据,再通过read函数接收数据。接收到的数据可以通过循环遍历输出。 当然,在使用usbhid库之前,需要先安装libusb库。在Linux上可以通过sudo apt-get install libusb-1.0-0-dev命令进行安装,而在Windows上需要将libusb库拷贝到项目目录并配置好。 希望以上示例能帮助你理解Qt usbhid库的使用。 ### 回答3: Qt是一款跨平台的C++开发框架,提供了丰富的类库和工具,用于开发各种应用程序。而usbhid(Universal Serial Bus Human Interface Device)是一种USB设备类型,用于与人机界面设备(如键盘、鼠标等)进行通信。 在Qt中使用usbhid实例,通常需要以下步骤: 1. 配置环境:首先,我们需要安装Qt开发环境,可以从官方网站下载并安装。同时,我们还需要安装相应的usbhid驱动程序,以确保我们的设备能够正常工作。 2. 引入相关类库:在Qt项目中引入usbhid相关类库,这些类库通常包含了与USB设备通信所需的函数和方法。 3. 打开设备:使用Qt提供的相关类库,我们可以打开已连接的USB设备。通常,我们需要指定设备的厂商ID和产品ID等信息来识别设备。 4. 发送和接收数据:一旦设备被成功打开,我们可以使用相关函数和方法来发送和接收数据。例如,我们可以发送指令给设备以控制其行为,并接收来自设备的数据。 5. 关闭设备:当我们不再需要访问USB设备时,应该及时关闭设备连接,释放资源。 使用usbhid的Qt实例可以实现诸如读取键盘输入、控制鼠标移动等功能。例如,我们可以编一个程序,读取来自USB键盘的按键信息,并在屏幕上显示相应的输入。 总的来说,Qt使用usbhid实例是一种方便、灵活的方式来与USB人机界面设备进行通信和交互,可以应用于各种应用场景,提供了丰富的功能和灵活性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值