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

sem*_*ser 8 macos xcode cocoa swift xcode7

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

我有一个简单的Cocoa Swift应用程序和一个计数器(Label). 在此输入图像描述

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

我使用Xcode 7.3.1.

更新1.我已经发现它在Cocoa中监控事件addGlobalMonitorForEventsMatchingMask:handler:功能,但我不确定我是否正确.

l'L*_*L'l 8

你对使用是正确的 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()
  }
}
Run Code Online (Sandbox Code Playgroud)

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

事件以异步方式发送到您的应用程序,您只能观察事件; 您无法修改或以其他方式阻止将事件传递到其原始目标应用程序.如果启用了辅助功能,或者您的应用程序受信任以进行辅助功能访问,则只能监视与密钥相关的事件(请参阅AXIsProcessTrusted).

请注意,不会为发送到您自己的应用程序的事件调用您的处理程序.

为了捕获应用程序中的事件,您可以使用addLocalMonitorForEventsMatchingMask:handler:NSClickGestureRecognizer对象或对象.

如果您想将全局事件监视器与手势识别器对象结合起来,那么只需将两个对象实现到您的类中即可.