QT全局鼠标监听器

3

我是从Java转到QT的新手。是否有类似于这个的东西: https://code.google.com/p/jnativehook/ 用于QT?我能获取所有带有坐标的鼠标事件吗?我已经做了以下操作:

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
    if (event->type() == QEvent::MouseButtonRelease)
    {
      QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
      ui->listWidget->addItem(QString("Mouse pressed: %1,%2").arg(mouseEvent>pos().x()).arg(mouseEvent->pos().y()));
    }
  return false;
}

这个功能在我的应用程序中可以正常工作,但只能在应用程序内部使用,无法在整个系统范围内使用。 我该如何在QT中使其正常工作? 此外,这只需要在Windows上运行...


在一个(可见的)小部件上调用grabMouse应该可以正常工作。 - ratchet freak
这个是系统范围内有效的吗? - user754730
不是针对Mac Cocoa,但适用于其他所有内容 - ratchet freak
刚刚尝试了这个:ui->listWidget->grabMouse(); 但它只是锁住了我的窗口,什么也没捕获到... - user754730
Windows钩子。 - thuga
显示剩余3条评论
1个回答

5

实际上很简单。我没有找到任何例子或资料。

后来我在YouTube上找到了一个视频,完全展示了我所需要的(对于键盘而言,鼠标基本相同)。

因此,如果有人需要这个,请看这里:

#include <Windows.h>
#pragma comment(lib, "user32.lib")
HHOOK hHook = NULL;
using namespace std;

LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam) {   
    switch( wParam )
    {
      case WM_LBUTTONDOWN:  qDebug() << "Left click"; // Left click
    }
    return CallNextHookEx(hHook, nCode, wParam, lParam);
}

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
hHook = SetWindowsHookEx(WH_MOUSE_LL, MouseProc, NULL, 0);
if (hHook == NULL) {
    qDebug() << "Hook failed";
}
ui->setupUi(this);
}

以下代码可以用于switch语句中,以检测收到的事件类型:
  • 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

5
您将自己的回答标记为“被接受的”,但该答案并未回答您自己的问题。您的问题是关于使用Qt实现全局鼠标钩子的,而您的答案是关于使用Win32实现全局鼠标钩子的(这是完全不同的技术)。 - Jamin Grey
这非常有帮助!你还有YouTube链接吗? - Jake W
@JakeW 抱歉忘记添加链接... https://www.youtube.com/watch?v=O0C4V6JmlNw 给你。 - user754730
这只能在Windows上工作。其他平台呢? - xiaoyifang
这确实可以工作,但在加载/卸载应用程序时会使鼠标光标出现卡顿。对我来说似乎是一种太大的妥协。 - i know nothing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接