我有一个非常奇怪的问题:
我的后台服务正试图通过使用NSEvents
监控NSEvent.addGlobalMonitorForEvents(matching: mask, handler: handler)
来检测用户是否处于空闲状态。到目前为止一切顺利,我能够毫无问题地获得mouseMoved,leftMouseDown或keyDown等鼠标和键盘通知。
但是我注意到,我没有收到手势的事件,比如用3个手指轻扫以显示任务控制。
目前我将所有NSEventMask
值都放入matching:
,因为我想要监控任何用户活动。有NSEventMask.any
价值,但如果我使用它,我就不会有任何事件......
这是我的代码:
EventMonitor-包装
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
}
}
}
跟踪-服务:
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()
}
}
我做错了什么? NSEventMask.any
有什么问题?任何建议将不胜感激。