Swift on OS X.如何处理全局鼠标事件?

Swift on OS X. How to handle global mouse events?

我是 Swift 和 Xcode 的新手,我有下一个问题:

我有一个简单的 Cocoa Swift 应用程序,只有一个计数器 (Label)。

如何处理我的 Mac 中的所有鼠标点击(在所有应用程序中)并将其显示在我的 Label 中?

我用的是Xcode7.3.1.

更新 1. 我已经发现它是 Cocoa 中的 Monitoring EventsaddGlobalMonitorForEventsMatchingMask:handler: 函数,但我不确定我走对了。

你是正确的使用 addGlobalMonitorForEventsMatchingMask:handler:

一个简单的示例可能如下所示:

AppDelegate.swift

class AppDelegate: NSObject, NSApplicationDelegate {

    @IBOutlet weak var window: NSWindow!
    @IBOutlet var textLabel : NSTextField!
    var eventHandler : GlobalEventMonitor?
    var gecount : Int = 0

    func applicationDidFinishLaunching(aNotification: NSNotification) {

        eventHandler = GlobalEventMonitor(mask: .LeftMouseDownMask, handler: { (mouseEvent: NSEvent?) in
        self.gecount += 1
        self.textLabel.stringValue = "global event monitor: \(self.gecount)"
    })
    eventHandler?.start()
  }
}

GlobalEventMonitor.swift

public class GlobalEventMonitor {

    private var monitor: AnyObject?
    private let mask: NSEventMask
    private let handler: NSEvent? -> ()

    public init(mask: NSEventMask, handler: NSEvent? -> ()) {
        self.mask = mask
        self.handler = handler
    }

    deinit {
        stop()
    }

    public func start() {
        monitor = NSEvent.addGlobalMonitorForEventsMatchingMask(mask, handler: handler)
    }

    public func stop() {
        if monitor != nil {
            NSEvent.removeMonitor(monitor!)
            monitor = nil
        }
    }
}

事件异步传递到您的应用程序,您只能观察事件;您不能修改或以其他方式阻止将事件传递到其原始目标应用程序。仅当启用辅助功能或您的应用程序的辅助功能访问受信任(请参阅 AXIsProcessTrusted)时,才可能监视与键相关的事件。

Note that your handler will not be called for events that are sent to your own application.

为了在您的应用中捕获事件,您可以使用 addLocalMonitorForEventsMatchingMask:handler: or the NSClickGestureRecognizer 对象。

如果您想将全局事件监视器与手势识别器对象结合起来,只需将这两个对象都实现到您的 class。