Swift on OS X.如何处理全局鼠标事件?
Swift on OS X. How to handle global mouse events?
我是 Swift 和 Xcode 的新手,我有下一个问题:
我有一个简单的 Cocoa Swift 应用程序,只有一个计数器 (Label
)。
如何处理我的 Mac 中的所有鼠标点击(在所有应用程序中)并将其显示在我的 Label
中?
我用的是Xcode7.3.1.
更新 1. 我已经发现它是 Cocoa 中的 Monitoring Events 和 addGlobalMonitorForEventsMatchingMask:handler:
函数,但我不确定我走对了。
你是正确的使用 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()
}
}
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
}
}
}
事件异步传递到您的应用程序,您只能观察事件;您不能修改或以其他方式阻止将事件传递到其原始目标应用程序。仅当启用辅助功能或您的应用程序的辅助功能访问受信任(请参阅 AXIsProcessTrusted)时,才可能监视与键相关的事件。
Note that your handler will not be called for events that are sent to
your own application.
为了在您的应用中捕获事件,您可以使用 addLocalMonitorForEventsMatchingMask:handler:
or the NSClickGestureRecognizer
对象。
如果您想将全局事件监视器与手势识别器对象结合起来,只需将这两个对象都实现到您的 class。
我是 Swift 和 Xcode 的新手,我有下一个问题:
我有一个简单的 Cocoa Swift 应用程序,只有一个计数器 (Label
)。
如何处理我的 Mac 中的所有鼠标点击(在所有应用程序中)并将其显示在我的 Label
中?
我用的是Xcode7.3.1.
更新 1. 我已经发现它是 Cocoa 中的 Monitoring Events 和 addGlobalMonitorForEventsMatchingMask:handler:
函数,但我不确定我走对了。
你是正确的使用 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()
}
}
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
}
}
}
事件异步传递到您的应用程序,您只能观察事件;您不能修改或以其他方式阻止将事件传递到其原始目标应用程序。仅当启用辅助功能或您的应用程序的辅助功能访问受信任(请参阅 AXIsProcessTrusted)时,才可能监视与键相关的事件。
Note that your handler will not be called for events that are sent to your own application.
为了在您的应用中捕获事件,您可以使用 addLocalMonitorForEventsMatchingMask:handler:
or the NSClickGestureRecognizer
对象。
如果您想将全局事件监视器与手势识别器对象结合起来,只需将这两个对象都实现到您的 class。