windows下侦听全局鼠标事件(利用win32API)

一、需求说明

正常情况下,Qt获取鼠标事件都是获取窗口内的鼠标事件,当窗口、控件 获取焦点之后,点击窗口内的控件,Qt都可以获取到鼠标事件。 如果窗口没有获取到焦点,或者 点击软件范围外的其他地方,Qt正常的事件捕获就无法监听鼠标的动作了。

现在的需求是: 需要在软件之外,任何地方点击鼠标,Qt程序里都能获取到数据事件,实现全局鼠标事件侦听。

这个可以利用win32的API接口SetWindowsHookEx来实现侦听。

具体实现代码看下面。

二、实现代码

侦听全局鼠标事件用到了windows系统API函数。

完整的测试代码如下:

 #include "widget.h"
 #include "ui_widget.h"
 #include
 #include
 #pragma execution_character_set("utf-8")
 ​
 #pragma comment(lib, "user32.lib")
 HHOOK hHook = NULL;
 using namespace std;
 ​
 ​
 /*
 WM_MOUSEMOVE = 0x200
 WM_LBUTTONDOWN = 0x201
 WM_LBUTTONUP = 0x202
 WM_LBUTTONDBLCLK = 0x203
 WM_RBUTTONDOWN = 0x204
 WM_RBUTTONUP = 0x205
 WM_RBUTTONDBLCLK = 0x206 双击事件
 WM_MBUTTONDOWN = 0x207
 WM_MBUTTONUP = 0x208
 WM_MBUTTONDBLCLK = 0x209
 WM_MOUSEWHEEL = 0x20A
 WM_XBUTTONDOWN = 0x20B
 WM_XBUTTONUP = 0x20C
 WM_XBUTTONDBLCLK = 0x20D
 WM_MOUSEHWHEEL = 0x20E
 */
 LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
 {
     switch(wParam)
    {
       case WM_LBUTTONDOWN:  //鼠标左键按下
            qDebug()