你对使用是正确的 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对象或对象.
如果您想将全局事件监视器与手势识别器对象结合起来,那么只需将两个对象实现到您的类中即可.