如何检测全局鼠标按钮事件

安哥尔

我想知道如何编写代码来全局监视鼠标按钮。这将用于OS X,我想尝试用Qt / C ++编写它。

首先,我不知道如何捕获这些全局事件。监控器应用程序将不会显示GUI,而只是一个在后台运行并检测到鼠标按钮被点击的进程。

在程序的第二部分中,我想根据所按下的鼠标键来启动热键。

我的最终想法是制作一个像steerMouse这样的免费程序,以弄清楚它是如何做到的。

我正在寻求从何处开始的指南-如何全局检测鼠标按钮事件?

库巴并没有忘记莫妮卡

仅使用Qt是不可能的。还有一个问题详细说明了问题。归结为:

  1. 在其上安装事件过滤器QApplication将使您可以在光标位于任何应用程序窗口上方但不在其外部时接收鼠标事件。这对您的情况没有帮助。

  2. 如果某个小部件使用抓住鼠标grabMouse(),它将全局接收所有鼠标事件,但与其他应用程序进行交互变得不可能。

因此,您将需要使用特定于平台的API来执行此操作-这意味着可可和用Objective C / C ++编写。除了Qt集成之外,还有一个问题的答案很好,几乎可以提供我们需要的所有内容。

缺少的部分(如下所示)是将独立代码与Qt集成在一起。这段代码显示了一个空的窗口小部件,仅用于说明我们为应用程序及其外部都正确处理了鼠标事件。

这是使用Cocoa的完整的可行示例。它需要进入一个.mm文件;不要忘记将其添加到OBJECTIVE_SOURCES您的qmake项目文件中(不要添加SOURCES!)。

不幸的是,没有一个函数/方法可以转换NSEventQMouseEvent最好的办法是从中复制并粘贴一些代码qnsview.mm不幸的是,但这是Qt平台抽象设计的结果:平台代码最终调用QWindowSystemInterface::handleMouseEvent(....)将事件发布到应用程序。

#include <QApplication>
#include <QAbstractNativeEventFilter>
#include <QTextStream>
#include <QWidget>
#include <cstdio>
#import <AppKit/AppKit.h>

QTextStream out(stdout);

class MyEventFilter : public QAbstractNativeEventFilter {
public:
    bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) {
        Q_UNUSED(eventType) Q_UNUSED(result)
        NSEvent * event = (NSEvent*)message;
        switch ([event type]) {
        case NSLeftMouseDown:
            out << "Lv"; break;
        case NSLeftMouseUp:
            out << "L^"; break;
        case NSRightMouseDown:
            out << "Rv"; break;
        case NSRightMouseUp:
            out << "R^"; break;
        case NSOtherMouseDown:
            out << [event buttonNumber] << "v"; break;
        case NSOtherMouseUp:
            out << [event buttonNumber] << "^"; break;
        default:
            return false;
        }
        out << endl;
        return false;
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QSharedPointer<QAbstractNativeEventFilter> filter(new MyEventFilter);
    const int mask =
            NSLeftMouseDownMask | NSLeftMouseUpMask |
            NSRightMouseDownMask | NSRightMouseUpMask |
            NSOtherMouseDownMask | NSOtherMouseUpMask;
    // The global monitoring handler is *not* called for events sent to our application
    id monitorId = [NSEvent addGlobalMonitorForEventsMatchingMask:mask handler:^(NSEvent* event) {
        filter->nativeEventFilter("NSEvent", event, 0);
    }];
    // We also need to handle events coming to our application
    a.installNativeEventFilter(filter.data());
    QWidget w;
    w.show();
    int rc = a.exec();
    [NSEvent removeMonitor:monitorId];
    return rc;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Unity全局鼠标事件

来自分类Dev

如何为按钮添加鼠标事件?

来自分类Dev

如何在GTK中获得全局鼠标事件?

来自分类Dev

如何抑制Windows中的全局鼠标单击事件?

来自分类Dev

如何在GTK中获得全局鼠标事件?

来自分类Dev

如何检测HTML中相邻元素上的鼠标事件

来自分类Dev

如何在AngularJS中检测鼠标事件的目标模型

来自分类Dev

鼠标移动并长时间触摸后,如何检测mouseup事件?

来自分类Dev

鼠标移动并长时间触摸后,如何检测mouseup事件?

来自分类Dev

如何使用Java检测系统中的每个鼠标事件

来自分类Dev

如何检测QWebView上是否按下了鼠标按钮?

来自分类常见问题

如何检测pygame中嵌套按钮内的鼠标单击

来自分类Dev

在全局事件之前响应单个鼠标事件

来自分类Dev

可以在MFC按钮控件上检测到鼠标右键单击事件吗?

来自分类Dev

wpf - notifyIcon - 鼠标事件 - 识别鼠标按钮

来自分类Dev

如何检测全局按键

来自分类Dev

如何检测鼠标左键单击,而不是在UI按钮组件上单击时检测

来自分类Dev

如何在CodenameOne中检测设备后退按钮事件

来自分类Dev

如何在 XMonad 中检测按键/按钮按下事件?

来自分类Dev

如何检测电源按钮事件android应用程序

来自分类Dev

Delphi:如何检查是否按下了任何鼠标按钮-鼠标事件之外?

来自分类Dev

AvaloniaUI:全局捕获上/下鼠标按钮

来自分类Dev

在OS X上使用Swift。如何处理全局鼠标事件?

来自分类Dev

matplotlib在鼠标事件时检测对象

来自分类Dev

电子检测全局滚动事件Mac

来自分类Dev

检测按住的两个鼠标按钮

来自分类Dev

Eclipse RCP / SWT:如何检测系统上其他地方发生的鼠标事件

来自分类Dev

如果我的程序不在前台,如何检测鼠标滚动事件

来自分类Dev

如何检测鼠标中键单击?

Related 相关文章

  1. 1

    Unity全局鼠标事件

  2. 2

    如何为按钮添加鼠标事件?

  3. 3

    如何在GTK中获得全局鼠标事件?

  4. 4

    如何抑制Windows中的全局鼠标单击事件?

  5. 5

    如何在GTK中获得全局鼠标事件?

  6. 6

    如何检测HTML中相邻元素上的鼠标事件

  7. 7

    如何在AngularJS中检测鼠标事件的目标模型

  8. 8

    鼠标移动并长时间触摸后,如何检测mouseup事件?

  9. 9

    鼠标移动并长时间触摸后,如何检测mouseup事件?

  10. 10

    如何使用Java检测系统中的每个鼠标事件

  11. 11

    如何检测QWebView上是否按下了鼠标按钮?

  12. 12

    如何检测pygame中嵌套按钮内的鼠标单击

  13. 13

    在全局事件之前响应单个鼠标事件

  14. 14

    可以在MFC按钮控件上检测到鼠标右键单击事件吗?

  15. 15

    wpf - notifyIcon - 鼠标事件 - 识别鼠标按钮

  16. 16

    如何检测全局按键

  17. 17

    如何检测鼠标左键单击,而不是在UI按钮组件上单击时检测

  18. 18

    如何在CodenameOne中检测设备后退按钮事件

  19. 19

    如何在 XMonad 中检测按键/按钮按下事件?

  20. 20

    如何检测电源按钮事件android应用程序

  21. 21

    Delphi:如何检查是否按下了任何鼠标按钮-鼠标事件之外?

  22. 22

    AvaloniaUI:全局捕获上/下鼠标按钮

  23. 23

    在OS X上使用Swift。如何处理全局鼠标事件?

  24. 24

    matplotlib在鼠标事件时检测对象

  25. 25

    电子检测全局滚动事件Mac

  26. 26

    检测按住的两个鼠标按钮

  27. 27

    Eclipse RCP / SWT:如何检测系统上其他地方发生的鼠标事件

  28. 28

    如果我的程序不在前台,如何检测鼠标滚动事件

  29. 29

    如何检测鼠标中键单击?

热门标签

归档