Mouse Hook

该代码实现了一个名为CMouseHook的类,用于在Qt环境中设置低级鼠标钩子(WH_MOUSE_LL),捕获并处理鼠标事件,如鼠标移动、按键按下和释放以及滚轮滚动。通过信号和槽机制,将系统级别的鼠标事件转化为QEvent对象进行处理。
摘要由CSDN通过智能技术生成
#ifndef CMOUSEHOOK_H
#define CMOUSEHOOK_H

#include <QObject>
#include <basetsd.h>
#include <windows.h>
class QEvent;

class CMouseHook : public QObject
{
    Q_OBJECT
public:
    static CMouseHook* InitMouseHook(QObject *parent = nullptr);

signals:
    bool HookEvent(QEvent*);

public slots:
protected:
    void* m_mousehook;
    static LONG_PTR mouseHook(int nCode,WPARAM wParam,LPARAM lParam);
    void Unhook();
    static CMouseHook *pCMouseHook;
public:

private:
    ~CMouseHook();
    explicit CMouseHook(QObject *parent = nullptr);
};

#endif // CMOUSEHOOK_H

#include "CMouseHook.h"

#include <QDebug>
#include <QCursor>
#include <QMouseEvent>
#include <QWheelEvent>

#include <windows.h>
#include "windowsx.h"
#include "winuser.h"


CMouseHook *CMouseHook::pCMouseHook=nullptr;

//1安装钩子,这里是改成定义一个函数,函数里包含安装钩子函数;
CMouseHook* CMouseHook::InitMouseHook(QObject *parent)
{
    if(pCMouseHook==nullptr)
       pCMouseHook = new CMouseHook(parent);
    pCMouseHook->m_mousehook=SetWindowsHookExW(WH_MOUSE_LL,CMouseHook::mouseHook,GetModuleHandle (0),NULL);
    return pCMouseHook;
}

//2定义一个钩子函数指针
LONG_PTR CALLBACK CMouseHook::mouseHook(int nCode,WPARAM wParam,LPARAM lParam)
{
    QEvent*event;

    int xPos = GET_X_LPARAM(lParam);
    int yPos = GET_Y_LPARAM(lParam);

    unsigned short fwKeys = GET_KEYSTATE_WPARAM (wParam);
    unsigned short fwButton = GET_XBUTTON_WPARAM (wParam);

   // qDebug()<<fwKeys<<fwButton<<xPos<<yPos<<QCursor::pos()<<(quint64)wParam<<lParam<<nCode<<
    GET_WHEEL_DELTA_WPARAM(wParam);
    xPos = QCursor::pos().rx();
    yPos = QCursor::pos().ry();

   static  Qt::MouseButtons button=Qt::NoButton;

    switch (wParam)
    {
    case WM_MOUSEMOVE:
        event=(QEvent*) new QMouseEvent(QMouseEvent::MouseMove, QPointF(xPos,yPos), Qt::NoButton, button, Qt::NoModifier );
        break;
    case WM_LBUTTONDOWN: button |= Qt::LeftButton;
        event=(QEvent*) new QMouseEvent(QMouseEvent::MouseButtonPress, QPointF(xPos,yPos), Qt::LeftButton, button, Qt::NoModifier );
        break;
    case WM_LBUTTONUP: button &= ~Qt::LeftButton;
        event=(QEvent*) new QMouseEvent(QMouseEvent::MouseButtonRelease, QPointF(xPos,yPos), Qt::LeftButton, button, Qt::NoModifier );
        break;
    case WM_RBUTTONDOWN: button |= Qt::RightButton;
        event=(QEvent*) new QMouseEvent(QMouseEvent::MouseButtonPress, QPointF(xPos,yPos), Qt::RightButton, button, Qt::NoModifier );
        break;
    case WM_RBUTTONUP:  button &= ~Qt::RightButton;
        event=(QEvent*) new QMouseEvent(QMouseEvent::MouseButtonRelease, QPointF(xPos,yPos), Qt::RightButton, button, Qt::NoModifier );
        break;
    case WM_MBUTTONDOWN: button |= Qt::MiddleButton;
        event=(QEvent*) new QMouseEvent(QMouseEvent::MouseButtonPress, QPointF(xPos,yPos), Qt::MiddleButton, button, Qt::NoModifier );
        break;
    case WM_MBUTTONUP: button &= ~Qt::MiddleButton;
        event=(QEvent*) new QMouseEvent(QMouseEvent::MouseButtonRelease, QPointF(xPos,yPos), Qt::MiddleButton, button, Qt::NoModifier );
        break;
    case WM_MOUSEWHEEL:
        event=(QEvent*) new QWheelEvent(QPointF(xPos,yPos), GET_WHEEL_DELTA_WPARAM(wParam), button, Qt::NoModifier );
        break;
    default:
        return CallNextHookEx(0, nCode, wParam, lParam);
        break;
    }

    emit pCMouseHook->HookEvent( event );

    return CallNextHookEx(0, nCode, wParam, lParam);
}


void CMouseHook::Unhook(){
    UnhookWindowsHookEx((HHOOK)m_mousehook);
}

CMouseHook::CMouseHook(QObject *parent) : QObject(parent)
{
}

CMouseHook::~CMouseHook()
{
    Unhook();
}











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值