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

}

相关推荐
共享家952737 分钟前
QT 初识
开发语言·qt
共享家952743 分钟前
QT文件解析与乱码问题
开发语言·qt
王嘉俊9251 小时前
Qt 入门:构建跨平台 GUI 应用的强大框架
c语言·开发语言·c++·qt·入门·cpp
txwtech3 小时前
第4篇 vs2019+QT调用SDK连接海康相机显示图片
开发语言·数码相机·qt
youyudexiaowangzi4 小时前
qt everywhere souce code编译
qt
科技观察7 小时前
刘诗雯现身TCL品牌活动,雷鸟34Q9显示器同台竞技
计算机外设
会飞的胖达喵9 小时前
Qt Widgets 应用程序核心类 - QApplication 详解
qt
大橘9 小时前
【qml-11】Quick3D实现机器人欧拉旋转、拖动视角
qt·3d·机器人·qml
枫叶丹49 小时前
【Qt开发】输入类控件(三)-> QComboBox
开发语言·qt
理想是做个英雄10 小时前
基于AC6366C做AI语音鼠标
人工智能·计算机外设·杰理ble,mcu以及音频蓝牙