我想知道如何编写代码来全局监视鼠标按钮。这将用于OS X,我想尝试用Qt / C ++编写它。
首先,我不知道如何捕获这些全局事件。监控器应用程序将不会显示GUI,而只是一个在后台运行并检测到鼠标按钮被点击的进程。
在程序的第二部分中,我想根据所按下的鼠标键来启动热键。
我的最终想法是制作一个像steerMouse这样的免费程序,以弄清楚它是如何做到的。
我正在寻求从何处开始的指南-如何全局检测鼠标按钮事件?
仅使用Qt是不可能的。还有一个问题详细说明了问题。归结为:
在其上安装事件过滤器QApplication
将使您可以在光标位于任何应用程序窗口上方但不在其外部时接收鼠标事件。这对您的情况没有帮助。
如果某个小部件使用抓住鼠标grabMouse()
,它将全局接收所有鼠标事件,但与其他应用程序进行交互变得不可能。
因此,您将需要使用特定于平台的API来执行此操作-这意味着可可和用Objective C / C ++编写。除了Qt集成之外,还有一个问题的答案很好,几乎可以提供我们需要的所有内容。
缺少的部分(如下所示)是将独立代码与Qt集成在一起。这段代码显示了一个空的窗口小部件,仅用于说明我们为应用程序及其外部都正确处理了鼠标事件。
这是使用Cocoa的完整的可行示例。它需要进入一个.mm
文件;不要忘记将其添加到OBJECTIVE_SOURCES
您的qmake项目文件中(不要添加到SOURCES
!)。
不幸的是,没有一个函数/方法可以转换NSEvent
为QMouseEvent
。最好的办法是从中复制并粘贴一些代码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] 删除。
我来说两句