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

}

相关推荐
ACP广源盛139246256734 小时前
破局 Type‑C 切换器痛点@ACP#GSV6155+LH3828/GSV2221+LH3828 黄金方案
c语言·开发语言·网络·人工智能·嵌入式硬件·计算机外设·电脑
freshman_y8 小时前
Qtcreator怎么新建安卓项目?编写一个五子棋游戏APP?
android·qt
wljy112 小时前
Qt入门(一)
开发语言·qt
火山上的企鹅12 小时前
QT/QGroundControl 实战:Mission Planner 航线在 QGC 中出现 Takeoff 落到 (0,0) 的排查与修复
qt·mp·qgc·无人机开发
雪的季节14 小时前
qt信号槽跨线程使用时候的坑
java·开发语言·qt
yy_xzz14 小时前
【Qt 开发笔记】能扛住断电、多线程的通用配置类(移植直接用)
笔记·qt
丁劲犇16 小时前
改造传统Qt6Widgets程序为多会话MCPServer生产力工具-技巧与实现
qt·ai·agent·并发·mcp·mcpserver·widgets
sycmancia17 小时前
Qt——对话框及其类型
开发语言·qt
sycmancia18 小时前
Qt——登录对话框
开发语言·qt
妙为1 天前
银河麒麟V4下编译Qt5.12.12源码
c++·qt·国产化·osg3.6.5·osgearth3.2·银河麒麟v4