动力 网站建设,重庆网站平台如何推广,如何做淘宝客有没有免费的网站,网络工具一、前言 玩游戏的时候遇到些枯燥无味反反复复的按鼠标键盘的情况时#xff0c;就想写个外挂自动释放。刚好在学qt所以试验了下QT能不能对外输出按键与鼠标。
二、思路 qt中的按键鼠标全是输入#xff0c;没有直接对外输出键盘鼠标指令的类#xff0c;但是我们换个思路就想写个外挂自动释放。刚好在学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.hMainWindow::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_castWORD(key 0x100); // 加0x100表示非扫描码input.ki.wVk static_castWORD(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 CodeVK Code键盘按键对应的值和QT中键盘按键枚举的值是不一样的如果要用的键盘按键多的话最好映射一下地址我做实验就没写映射。下述为Virtual Key CodeVK 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自动按下脚本