2016-07-21 12 views
5

Jestem nowy w Swift i Xcode i mam kolejny problem:Swift na OS X. Jak radzić sobie z globalnymi zdarzeniami myszy?

Mam prostą aplikację kakao Swift z jednym licznikiem (Label). enter image description here

Jak obsługiwać wszystkie kliknięcia myszy w moim Mac (we wszystkich aplikacjach) i wyświetlić go w moim Label?

Używam Xcode 7.3.1.

UPDATE 1. Co mam alredy znaleźć to Monitoring Events i addGlobalMonitorForEventsMatchingMask:handler: funkcji w kakao, ale nie jestem pewien, że jestem na dobrej drodze.

Odpowiedz

5

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.

Powiązane problemy