使用 addGlobalMonitorForEvents 监控 NSEvents 缺少手势事件

Joh*_*yAW 5 macos cocoa swift

我有一个很奇怪的问题:

我的后台服务正在尝试通过NSEvents使用NSEvent.addGlobalMonitorForEvents(matching: mask, handler: handler). 到目前为止一切顺利,我能够毫无问题地获得鼠标和键盘通知,例如 mouseMoved、leftMouseDown 或 keyDown。

但我注意到,我没有收到像 3 指滑动以显示任务控制等手势的事件。目前我将所有NSEventMask值都放入 中matching:,因为我想监视任何用户活动。还有NSEventMask.any价值,但如果我使用它,我有点不明白,在所有的事件......

这是我的代码:

EventMonitor-Wrapper

public class EventMonitor {
    private var monitor: Any?
    private let mask: NSEventMask
    private let handler: (NSEvent?) -> ()

    public init(mask: NSEventMask, handler: @escaping (NSEvent?) -> ()) {
        self.mask = mask
        self.handler = handler
    }

    deinit {
        stop()
    }

    public func start() {
        self.monitor = NSEvent.addGlobalMonitorForEvents(matching: mask, handler: handler)
    }

    public func stop() {
        if self.monitor != nil {
            NSEvent.removeMonitor(self.monitor!)
            self.monitor = nil
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

跟踪服务:

private static let inactivityEvents: NSEventMask = [NSEventMask.leftMouseDown, NSEventMask.leftMouseUp, NSEventMask.rightMouseDown, NSEventMask.rightMouseUp, NSEventMask.mouseMoved, NSEventMask.leftMouseDragged, NSEventMask.rightMouseDragged, NSEventMask.mouseEntered, NSEventMask.mouseExited, NSEventMask.keyDown, NSEventMask.keyUp, NSEventMask.flagsChanged, NSEventMask.appKitDefined, NSEventMask.systemDefined, NSEventMask.applicationDefined, NSEventMask.periodic, NSEventMask.cursorUpdate, NSEventMask.scrollWheel, NSEventMask.tabletPoint, NSEventMask.tabletProximity, NSEventMask.otherMouseDown, NSEventMask.otherMouseUp, NSEventMask.otherMouseDragged, NSEventMask.gesture, NSEventMask.magnify, NSEventMask.swipe, NSEventMask.rotate, NSEventMask.beginGesture, NSEventMask.endGesture, NSEventMask.smartMagnify, NSEventMask.pressure]

init() {
    self.eventMonitor = EventMonitor(mask: TrackingService.inactivityEvents) {event in
        print("event detected: \(event)")
        if self.isTracking() {
            self.idleTimer = Timer.scheduledTimer(timeInterval: 2 * 60, target: self, selector: #selector(TimeTrackingService.inactivityDetected(_:)), userInfo: nil, repeats: false)
        } else {
            self.unpauseTracking()
        }
    }
}

func startService() {
    //start service will be called from a background queue
    DispatchQueue.main.async {
        self.eventMonitor?.start()
    }
}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?怎么了NSEventMask.any?任何意见,将不胜感激。

sou*_*lix 1

我认为手势无法通过设计进行全局跟踪。苹果的文档中列出了应该有效的addGlobalMonitorForEvents(matching:handler:)列表NSEvent.EventTypeMask,但滑动并不在其中。