使用qt 定义全局钩子 捕获系统的键盘事件

使用qt 定义全局钩子 捕获系统的键盘事件 即使焦点不在自定义软件上,也能够触发

以下待接口代码:

class Hook :public QObject

{

Q_OBJECT

public:

Hook();

enum Type {

CTRL_E,

CTRL_W,

SPACE,

Enter,

C

};//自定义枚举,定义"修改"、"撤回"两种状态

void installHook();//安装钩子函数

void unInstallHook();//删除钩子

void sendSignal(Type type);

Q_ENUM(Type)//注册枚举类型进元对象系统,否则无法将枚举类型作为信号参数传递

signals:

void sendKeyType(Type);//发送按键监控信号

};

static HHOOK keyHook = nullptr;//钩子对象

static Hook* hook;//Qt界面中调用Hook类的对象

LRESULT CALLBACK keyProc(int nCode, WPARAM wParam, LPARAM lParam) {//钩子消息函数,系统消息队列信息会返回到该函数中

KBDLLHOOKSTRUCT* pkbhs = (KBDLLHOOKSTRUCT*)lParam;//lParam用于判断按键类型

if (wParam == WM_KEYDOWN) {//wParam用于判断事件类型,当前为按键按下事件

//使用位掩码0x8000检查按键按下状态,确保准确检测瞬时按键

if (pkbhs->vkCode == Qt::Key_E &&

(GetAsyncKeyState(VK_CONTROL) & 0x8000) &&

(GetAsyncKeyState(VK_MENU) & 0x8000)) // Ctrl+Alt+E

{

qDebug() << ("按下按钮 ctrl+alt+e\n");

}

else if (pkbhs->vkCode == Qt::Key_E &&

(GetAsyncKeyState(VK_CONTROL) & 0x8000)) // 仅Ctrl+E

{

hook->sendSignal(Hook::CTRL_E);

LOG_FUN_INFO("##############Input Ctrl+E##############");

}

else if (pkbhs->vkCode == Qt::Key_W &&

(GetAsyncKeyState(VK_CONTROL) & 0x8000))

{//按下Ctrl+W

hook->sendSignal(Hook::CTRL_W);

LOG_FUN_INFO("##############Input Ctrl+W##############");

}

else if (pkbhs->vkCode == Qt::Key_Space)

{//按下space

hook->sendSignal(Hook::SPACE);

}

else if (pkbhs->vkCode == 13) //Enter Key

{//按下space

hook->sendSignal(Hook::Enter);

}

else if (pkbhs->vkCode == Qt::Key_C)

{//按下space

hook->sendSignal(Hook::C);

}

}

LOG_FUN_INFO("##############Input %d", pkbhs->vkCode);

return CallNextHookEx(keyHook, nCode, wParam, lParam);//继续原有的事件队列

}

Hook::Hook()

{

}

void Hook::installHook() {//安装钩子函数

keyHook = SetWindowsHookEx(WH_KEYBOARD_LL, keyProc, nullptr, 0);

hook = this;

}

void Hook::unInstallHook() {//删除钩子函数

UnhookWindowsHookEx(keyHook);

keyHook = nullptr;

}

void Hook::sendSignal(Type type) {//发送信号函数

emit sendKeyType(type);

}

相关推荐
读书札记20229 小时前
Qt界面卡死问题探讨及解决方法
qt
bug和崩溃我都要14 小时前
Qt 封装 libmpv 全功能视频播放器开发指南
开发语言·qt·音视频
郝学胜-神的一滴14 小时前
Qt 高级开发 018:复刻经典登录界面布局与窗口美化全解析
开发语言·c++·qt·程序人生·用户界面
小新11014 小时前
qt creator 将qInfo的输出日志写入日志文档,方便查看
开发语言·qt
hssfscv15 小时前
QT的学习记录1
开发语言·qt·学习
yong999016 小时前
基于Qt的文件传输系统
开发语言·qt
誰能久伴不乏16 小时前
ibmodbus “Invalid argument“ 错误的排查与修复
c++·qt·modbus
肥or胖17 小时前
Qt中OpenGL快速入门
qt·音视频·opengl
程序员如山石20 小时前
QT标签左侧水平显示
qt
xcyxiner20 小时前
ubuntu下 cmake初始化脚本 以及 qt依赖
c++·qt