2016-07-21 12 views
5

Ich bin neu in Swift und Xcode und ich habe das nächste Problem:Swift auf OS X. Wie behandelt man globale Mausereignisse?

Ich habe einfache Cocoa Swift-Anwendung mit einem Zähler (Label). enter image description here

Wie alle Mausklicks in meinem Mac behandeln (in allen Anwendungen) und es in meinem Label angezeigt werden?

Ich benutze Xcode 7.3.1.

UPDATE 1. Was ich alredy gefunden habe, es ist Monitoring Events und addGlobalMonitorForEventsMatchingMask:handler: Funktion in Cocoa, aber ich bin nicht sicher, dass ich auf dem richtigen Weg bin.

Antwort

5

Sie sind richtig über addGlobalMonitorForEventsMatchingMask:handler:

Ein einfaches Beispiel mit könnte wie folgt aussehen:

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 
     } 
    } 
} 

Ereignisse werden asynchron an Ihre App gesendet, und Sie können das Ereignis nur beobachten. Sie können das Ereignis nicht an seine ursprüngliche Zielanwendung ändern oder anderweitig verhindern. Schlüsselbezogene Ereignisse können nur überwacht werden, wenn die Barrierefreiheit aktiviert ist oder wenn Ihre Anwendung für den Zugriff auf Eingabehilfen vertraut ist (siehe AXIsProcessTrusted).

Beachten Sie, dass Ihr Handler nicht für Ereignisse genannt werden, die Ihre eigene Anwendung gesendet werden.

Um Ereignisse in Ihrer App zu erfassen Ihr entweder die addLocalMonitorForEventsMatchingMask:handler: oder die NSClickGestureRecognizer Objekt verwenden können.

Wenn Sie den globalen Ereignismonitor mit dem Gestenerkennerobjekt kombinieren möchten, müssen Sie lediglich beide Objekte in Ihre Klasse implementieren.