我目前正在鼠标拖动函数中获取下一个事件
while true {
guard let nextEvent = self.window?.nextEvent(matching: [.leftMouseDragged, .leftMouseUp, .rightMouseUp]) else {
continue
}
switch nextEvent.type {
case .leftMouseDragged:
self.cursorUpdate(with: nextEvent)
self.mouseDragged(with: nextEvent)
case .rightMouseUp:
continue
default:
self.mouseUp(with: nextEvent)
return
}
}
我只是想在持续时间内禁用右键单击。但是,通过此实现,右键单击只是排队并在循环完成后被调用。
我将如何完全禁用注册的右键单击?
尝试将.rightMouseDown
和.rightMouseDragged
添加到匹配的掩码中。它是使 AppKit 显示上下文菜单的.rightMouseDown
事件。
guard let nextEvent = self.window?.nextEvent(matching: [.leftMouseDragged, .leftMouseUp, .rightMouseDown, .rightMouseDragged, .rightMouseUp]) else {
continue
}
您也可以考虑切换到NSWindow.trackEvents(matching:timeout:mode:handler:)
而不是编写自己的循环:
window.trackEvents(matching: [.leftMouseDragged, .leftMouseUp, .rightMouseDown, .rightMouseDragged, .rightMouseUp], timeout: NSEvent.foreverDuration, mode: .eventTrackingRunLoopMode) { (event, outStop) in
guard let event = event else { return }
switch event.type {
case .rightMouseDown, .rightMouseDragged, .rightMouseUp: return
case .leftMouseDragged:
self.cursorUpdate(with: event)
self.mouseDragged(with: event)
case .leftMouseUp:
self.mouseUp(with: event)
outStop.pointee = true
default:
break
}
}
使用 trackEvents
可以让 AppKit 运行主运行循环,因此计时器和观察者可以继续触发(如果它们计划在 .eventTrackingRunLoopMode
中触发(。