#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();
}