如何在NSTextView上拖动鼠标时检测鼠标右键和其他鼠标按下?

时间:2016-07-09 05:23:14

标签: macos cocoa nstextview

当用户用鼠标左键选择文本并按住鼠标左键并单击鼠标右键btn时,我正在尝试实现调用操作。

我目前正在覆盖rightMouseDownotherMouseDown,但在用户按住鼠标左键btn时却没有调用。我怎样才能实现它?

1 个答案:

答案 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)

那就是它!尝试一下,我很好奇它是否有效。