QT后台监控键盘和鼠标

目录

一、QT程序激活状态下的监控;
二、QT程序非激活状态下的监控

一、QT程序激活状态下的监控;

主要方法:重写键盘、鼠标事件(教程多,略过)

void mouseMoveEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void keyPressEvent(QKeyEvent  *event);

二、QT程序非激活状态下的监控

主要方法:HHOOK DLL

知识要点:

> 1.HOOK学习 2.生成DLL 3.调用DLL

1、HOOK过程

1.1定义static HHOOK hook
1.2安装SetWindowsHookEx(…)
1.3回调函数LRESULT CALLBACK HOOKProc(…)
1.4卸载UnhookWindowsHookEx(…)

1.1 安装钩子:SetWindowsHookEx原型
https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setwindowshookexw

HHOOK SetWindowsHookEx(
 int idHook,     //它是和钩子函数类型一一对应的。常用钩子函数类型如下:
 				//WH_KEYBOARD键盘钩子,WH_KEYBOARD_LL,不用新建dll即可捕获全局消息
 				//WH_MOUSE表示是鼠标钩子,WH_MOUSE_LL是低级鼠标钩子;     
 HOOKPROC lpfn,     // 钩子函数的地址,名字可自己定义见1.2
 HINSTANCE hMod,    // 钩子函数所在的实例的句柄。对于线程钩子,该参数为NULL;对于系统钩子,该参数为钩子函数所在的DLL句柄。
					 //	https://blog.csdn.net/liu_yude/article/details/45949933
					 //HINSTANCE hInst= GetModuleHandle (0);获取当前应用程序实例
					 // ModuleFromAddress((PVOID)KeyboardHookPro
 DWORD dwThreadId   // 指定钩子所监视的线程的线程号。对于全局钩子,该参数为NULL。
 );

1.2定义钩子: LRESULT CALLBACK HOOKProc()原型

LRESULT  CALLBACK  HookProc(     //HookProc可自定义名字
    int  nCode, 		//nCode包含有关消息本身的信息;比如是否从消息队列中移出。
    WPARAM  wParam,	    //参数wParam和lParam包含所钩消息的信息,比如鼠标位置、状态,键盘按键等。
    LPARAM  lParam	    //参数wParam和lParam包含所钩消息的信息,比如鼠标位置、状态,键盘按键等。
     );

CallNextHookEx.的原型如下:

LRESULT  CallNextHookEx(
HHOOK hhk,          //hhk是钩子句柄
 int nCode,
 WPARAM wParam,
 LPARAM lParam
 );

1.3卸载钩子:UnhookWindowsHookEx原型

BOOL  UnhookWindowsHookEx(HHOOK  hhk)

例子:后台监控鼠标侧键(最重要的函数GetModuleHandle (0))

//mousehook.h
    
#ifndef MOUSEHOOK_H
#define MOUSEHOOK_H
#include<windows.h>
  
//1,开始都要先定义个钩子
static HHOOK hook;

//2安装钩子,这里是改成定义一个函数,函数里包含安装钩子函数;
int set_mousehook();

//3定义一个钩子函数指针
LRESULT CALLBACK mouseHook(int nCode,WPARAM wParam,LPARAM lParam);

//4卸载钩子,同样定义个函数
void unload_mousehook();

#endif // MOUSEHOOK_H

源文件

 //mousehook.cpp
    #include"mousehook.h"
    #include<QDebug>
    
//1安装钩子,这里是改成定义一个函数,函数里包含安装钩子函数;
    int set_mousehook(){

  hook=SetWindowsHookExW(WH_MOUSE_LL,mouseHook,GetModuleHandle (0),NULL);

}

//2定义一个钩子函数指针
LRESULT CALLBACK mouseHook(int nCode,WPARAM wParam,LPARAM lParam){
    if (wParam == WM_XBUTTONDOWN)
        {
             qDebug()<< wParam;
        }
        else if (wParam == WM_XBUTTONUP)
        {
            qDebug() << wParam;
        }
        return CallNextHookEx(0, nCode, wParam, lParam);
}

//3卸载钩子,同样定义个函数
void unload_mousehook(){

    UnhookWindowsHookEx(hook);
}

下载资源:https://download.csdn.net/download/soso_coco/11115358

QT 中,可以使用事件过滤器来监控鼠标键盘操作。事件过滤器是 QT 中的一个重要机制,可以在一个对象中拦截和处理其他对象发送的事件。例如,在一个 QWidget 对象中,可以安装一个事件过滤器,来监视其他对象发送的事件。 下面是一个示例代码,用于在 QT监控鼠标键盘操作: ```cpp #include <QApplication> #include <QEvent> #include <QMouseEvent> #include <QKeyEvent> #include <QDebug> class EventFilter : public QObject { public: EventFilter(QObject* parent = nullptr) : QObject(parent) { } protected: bool eventFilter(QObject* obj, QEvent* event) override { if (event->type() == QEvent::MouseButtonPress) { QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event); qDebug() << "鼠标按下:" << mouseEvent->button() << ",位置:" << mouseEvent->pos(); } else if (event->type() == QEvent::KeyPress) { QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event); qDebug() << "按键按下:" << keyEvent->key(); } return QObject::eventFilter(obj, event); } }; int main(int argc, char *argv[]) { QApplication a(argc, argv); // 创建一个 QWidget 对象,并安装事件过滤器 QWidget widget; EventFilter eventFilter(&widget); widget.installEventFilter(&eventFilter); widget.show(); return a.exec(); } ``` 在上面的代码中,我们创建了一个 EventFilter 类,继承自 QObject,用于作为事件过滤器。在 eventFilter 方法中,我们判断事件的类型,如果是鼠标按下事件,就打印鼠标的按键和位置信息;如果是按键按下事件,就打印按键的键码。 然后,在 main 函数中,我们创建了一个 QWidget 对象,并安装了上面创建的事件过滤器。当用户在这个 QWidget 对象中进行鼠标键盘操作时,事件会先发送到事件过滤器中,被拦截和处理。 当然,如果你需要在整个应用程序中监控鼠标键盘操作,你可以在 QApplication 对象中安装事件过滤器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值