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

}

相关推荐
zfysis10 小时前
键盘第一下无反应
计算机外设
Mr_Xuhhh10 小时前
网络基础(1)
c语言·开发语言·网络·c++·qt·算法
feiyangqingyun13 小时前
Qt音视频开发技巧/推流带旋转角度/rtsprtmp推流/保存文件到MP4/拉流解析旋转角度
qt·音视频·qt旋转角度推流
清醒的兰14 小时前
Qt 基于TCP套接字编程
网络·qt·tcp
mahuifa10 天前
PySide环境配置及工具使用
python·qt·环境配置·开发经验·pyside
小灰灰搞电子10 天前
Qt PyQt与PySide技术-C++库的Python绑定
c++·qt·pyqt
Echo``10 天前
12.OpenCV—基础入门
开发语言·c++·人工智能·qt·opencv·计算机视觉
智驾10 天前
QML革命:下一代GUI开发的核心优势详解
qt·qml
五_谷_丰_登10 天前
mongoDB服务本地化部署
数据库·c++·qt·mongodb
Allen Bright10 天前
【JS-4.4-键盘常用事件】深入理解DOM键盘事件:提升用户交互体验的关键
javascript·计算机外设·交互