2016-07-09 8 views
0

Ich versuche, Aufruf Aktion zu erreichen, wenn Benutzer Text mit der linken Maustaste auswählen und halten Sie die linke Maustaste gedrückt und klicken Sie mit der rechten Maustaste btn.Wie erkennt man die rechte Maustaste und die andere Maustaste, während die linke Maustaste auf NSTextView gezogen wird?

Ich bin derzeit überschreiben rightMouseDown und otherMouseDown, aber es wird nicht aufgerufen, während Benutzer mit der linken Maustaste btn. Wie kann ich es erreichen?

+0

Warum würde ein Benutzer mit der rechten Maustaste klicken und dabei die linke Maustaste gedrückt halten? Dies ist mit den meisten Mac-Hardware nicht möglich. Wäre es nicht genug, wenn der Benutzer Text auswählt, die linke Maustaste loslässt und dann wieder mit der rechten Maustaste klickt? – mangerlahn

Antwort

1

Warum würde ein Benutzer mit der rechten Maustaste klicken und gleichzeitig die linke Maustaste gedrückt halten? Dies ist mit den meisten Mac-Hardware nicht möglich. Wäre es nicht genug, wenn der Benutzer Text auswählt, die linke Maustaste loslässt & und dann wieder rechtsklickt?

Aber falls Sie wirklich benötigen ein solches Feature: ich nicht getestet, da ich nicht die Hardware nach unten für & rechte Maus gleichzeitig links nennen, aber es Macht Arbeit.

Sie können eine Ebene tiefer gehen und mit CGEvent Objekte arbeiten. So funktionieren sie:

Erstellen Sie eine Bitmaske, um die Ereignisse zu definieren, auf die Sie reagieren möchten.

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())) 

Und schließlich müssen Sie diese CFMachPort zu einem Runloop zurück hinzuzufügen.

let runloopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0) 
CFRunLoopAddSource(CFRunLoopGetCurrent(), runloopSource, CFRunLoopMode.commonModes) 

Das ist es !. Probieren Sie es aus, ich bin neugierig, ob es funktioniert.

Verwandte Themen