Masz rację na temat korzystania addGlobalMonitorForEventsMatchingMask:handler:
Prostym przykładem może wyglądać mniej więcej tak:
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
}
}
}
Zdarzenia dostarczane są asynchronicznie do aplikacji i można obserwować tylko zdarzenie; nie można modyfikować ani w inny sposób uniemożliwić dostarczenia zdarzenia do pierwotnej docelowej aplikacji. Zdarzenia powiązane z kluczami mogą być monitorowane tylko wtedy, gdy włączona jest dostępność lub jeśli aplikacja jest zaufana w celu uzyskania dostępu (patrz AXIsProcessTrusted).
pamiętać, że przewodnik nie zostanie wywołana dla zdarzeń, które są wysyłane do własnej aplikacji.
W celu uchwycenia wydarzeń w Twojej aplikacji można użyć do addLocalMonitorForEventsMatchingMask:handler:
lub przedmiot NSClickGestureRecognizer
.
Jeśli chcesz połączyć globalny monitor zdarzeń z obiektem do rozpoznawania gestów, jest to po prostu kwestia implementacji obu obiektów w klasie.