Bạn là chính xác về việc sử dụng addGlobalMonitorForEventsMatchingMask:handler:
Một ví dụ đơn giản có thể trông như thế này:
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
}
}
}
Sự kiện được phân phối không đồng bộ đến ứng dụng của bạn và bạn chỉ có thể quan sát sự kiện; bạn không thể sửa đổi hoặc ngăn cản sự kiện được gửi đến ứng dụng đích ban đầu của nó. Các sự kiện liên quan đến khóa chỉ có thể được giám sát nếu khả năng truy cập được bật hoặc nếu ứng dụng của bạn được tin cậy để truy cập trợ năng (xem AXIsProcessTrusted).
Lưu ý rằng người xử lý của bạn sẽ không được gọi cho các sự kiện được gửi đến đơn đăng ký của riêng bạn.
Để nắm bắt sự kiện trong phạm vi ứng dụng của bạn của bạn có thể sử dụng addLocalMonitorForEventsMatchingMask:handler:
hoặc đối tượng NSClickGestureRecognizer
.
Nếu bạn muốn kết hợp trình giám sát sự kiện toàn cầu với đối tượng nhận dạng cử chỉ, nó chỉ đơn giản là vấn đề triển khai cả hai đối tượng vào lớp của bạn.
Nguồn
2016-07-21 23:19:25