使用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);

}

相关推荐
Larry_Yanan2 小时前
Qt线程使用(一)直接继承QThread类
开发语言·c++·qt·ui
宠..3 小时前
Qt 6 详细介绍
开发语言·qt
xxp43213 小时前
Qt 多线程
开发语言·qt
一叶之秋14123 小时前
Qt中的信号与槽
qt
开始了码4 小时前
QT::键盘事件简单介绍
qt
lijiatu100864 小时前
[C++ ]qt槽函数及其线程机制
c++·qt
i***17184 小时前
使用 Qt 插件和 SQLCipher 实现 SQLite 数据库加密与解密
数据库·qt·sqlite
Morgana_Mo4 小时前
iOS_输入框键盘跟随最佳实践
ios·计算机外设·cocoa
遇到困难睡大觉哈哈4 小时前
HarmonyOS IPC/RPC 实战:用 ArkTS 跑通 Proxy–Stub 整条链路
qt·rpc·harmonyos·鸿蒙
寻找华年的锦瑟13 小时前
Qt-视频九宫格布局
开发语言·qt