当用户用鼠标左键选择文本并按住鼠标左键并单击鼠标右键btn
时,我正在尝试实现调用操作。
我目前正在覆盖rightMouseDown
和otherMouseDown
,但在用户按住鼠标左键btn
时却没有调用。我怎样才能实现它?
答案 0 :(得分:1)
为什么用户在按住鼠标的同时右键单击?大多数Mac硬件都无法做到这一点。如果用户选择文本,则释放鼠标左右,这样就不够了。然后再次点击右键?
但是如果真的需要这样的功能: 我没有测试过这个,因为我没有同时调用left&的硬件。鼠标右键,但可能工作。
您可以更深入地使用CGEvent
个对象。
以下是它们的工作原理:
创建位掩码以定义要响应的事件。
let eventMask = eventMask | (1 << CGEventType.leftMouseDown.rawValue)
| (1 << CGEventType.leftMouseUp.rawValue)
| (1 << CGEventType.rightMouseDown.rawValue)
| (1 << CGEventType.rightMouseUp.rawValue)
| (1 << CGEventType.otherMouseDown.rawValue)
| (1 << CGEventType.otherMouseUp.rawValue)
self.eventTap = CGEvent.tapCreate(tap: .cghidEventTap, place: .headInsertEventTap, options: .defaultTap, eventsOfInterest: CGEventMask(eventMask), callback: { (proxy: CGEventTapProxy, type: CGEventType, event: CGEvent, userInfo: UnsafeMutablePointer<Void>?) -> Unmanaged<CGEvent>? in
// mySelf is self, if you need to refer to objects in this class
let mySelf = Unmanaged<MyClass>.fromOpaque(userInfo!).takeUnretainedValue()
if type == .leftMouseDown || type == .leftMouseUp {
// Left mouse down etc..
}
return Unmanaged.passUnretained(event)
}, userInfo: UnsafeMutablePointer(Unmanaged.passUnretained(self).toOpaque()))
最后,您需要将此返回的CFMachPort
添加到runLoop。
let runloopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0)
CFRunLoopAddSource(CFRunLoopGetCurrent(), runloopSource, CFRunLoopMode.commonModes)
那就是它!尝试一下,我很好奇它是否有效。