Qt使用钩子后台监控键盘并在界面中响应

Qt使⽤钩⼦后台监控键盘并在界⾯中响应当我们的Qt程序需要在后台监听键盘的操作或者屏蔽键盘的操作时,就需要⽤到系统的API,因此⽤到Windows钩⼦,下⾯简单介绍下使⽤钩⼦监控键盘按键,原理较简单,代码上我都注释了,⽐较容易看懂,⼀些参数不懂的可以参考官⽅⽂档:
1、创建钩⼦处理类Hook:
Hook.h:
#ifndef HOOK_H
#define HOOK_H
#include <windows.h>
#include <QObject>
class Hook:public QObject
{
Q_OBJECT
public:
Hook();
enum Type{CHANGE,CHANGEBACK};//⾃定义枚举,定义“修改”、“撤回”两种状态
void installHook(Hook*);//安装钩⼦函数,指针参数为了发送信号
汽车脚垫生产线void unInstallHook();//删除钩⼦
void sendSignal(Type type);
Q_ENUM(Type)//注册枚举类型进元对象系统,否则⽆法将枚举类型作为信号参数传递
signals:
void sendKeyType(Type);//发送按键监控信号
};
#endif // HOOK_H
Hook.cpp:
#include "hook.h"
#include <QDebug>
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⽤于判断事件类型,当前为按键按下事件
if(pkbhs->vkCode == 0x31&&GetAsyncKeyState(VK_CONTROL)){//按下Ctrl+1
hook->sendSignal(Hook::CHANGE);//安装钩⼦的对象发出按键监听信号
}
if(pkbhs->vkCode == 0x32&&GetAsyncKeyState(VK_CONTROL)){//按下Ctrl+2
hook->sendSignal(Hook::CHANGEBACK);
}
}
return CallNextHookEx(keyHook,nCode,wParam,lParam);//继续原有的事件队列
}
Hook::Hook()
{
}
void Hook::installHook(Hook* h){//安装钩⼦函数
keyHook = SetWindowsHookEx(WH_KEYBOARD_LL,keyProc,nullptr,0);
hook = h;
}
void Hook::unInstallHook(){//删除钩⼦函数
UnhookWindowsHookEx(keyHook);
keyHook = nullptr;
}
void Hook::sendSignal(Type type){//发送信号函数
emit sendKeyType(type);
}
2、Qt界⾯中调⽤Hook,安装钩⼦函数,并对接收的信号进⾏处理:
widget.h:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QObject>
#include "hook.h"
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = nullptr);    ~Widget();
private:
Ui::Widget *ui;
Hook hook;//钩⼦对象
土豆炮点火装置private slots:
void checkType(Hook::Type);
};
#endif // WIDGET_H
widget.cpp:
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QMetaType>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
hook.installHook(&hook);
qRegisterMetaType<Hook::Type>("Type");//为了信号中能传递⾃定义枚举类型,如果传递常规参数,可省略该⾏    connect(&hook,SIGNAL(sendKeyType(Type)),this,SLOT(checkType(Type)));
}
Widget::~Widget()
{
delete ui;
hook.unInstallHook();
}
void Widget::checkType(Hook::Type type){
switch (type) {
case Hook::CHANGE:
ui->plainTextEdit->appendPlainText("按下按钮 Ctrl+1 \n");
太白参
break;
case Hook::CHANGEBACK:
ui->plainTextEdit->appendPlainText("按下按钮 Ctrl+2 \n");
break;
default:
break;
}
}
界⾯效果(widget⽆论有没有焦点均能响应):
附⽂(VK_Code):
Constant/value Description
VK_LBUTTON
Left mouse button
0x01
VK_RBUTTON
Right mouse button
0x02
VK_CANCEL
Control-break processing
0x03
VK_MBUTTON
0x04
Middle mouse button (three-button mouse)
VK_XBUTTON1
0x05
X1 mouse button
VK_XBUTTON2
0x06
X2 mouse button
-
0x07
Undefined
VK_BACK
0x08
BACKSPACE key
VK_TAB
0x09
TAB key
-
0x0A-0B
Reserved
VK_CLEAR
缝隙式排水沟
0x0C
CLEAR key
VK_RETURN
0x0D
ENTER key
-
0x0E-0F
Undefined
VK_SHIFT
0x10
SHIFT key
VK_CONTROL
吹管消声器0x11
CTRL key
VK_MENU
0x12
ALT key
VK_PAUSE
0x13
PAUSE key
VK_CAPITAL
0x14
CAPS LOCK keygps信号转发器
VK_KANA
0x15
IME Kana mode
VK_HANGUEL
0x15IME Hanguel mode (maintained for compatibility; use VK_HANGUL)
VK_HANGUL
0x15
IME Hangul mode
VK_IME_ON
0x16
IME On
VK_JUNJA 0x17IME Junja mode
Constant/value Description

本文发布于:2024-09-25 14:24:11,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/311127.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:信号   类型   函数   按键
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议