2010-12-19 10 views
5

Ich aktualisiere (downdate?) Eine Anwendung, die ich für 10.6 geschrieben habe, um in 10.5+ zu arbeiten. Ich habe Probleme mit der Erfassung der aktuell gedrückten Maustaste im -(void)menuWillOpen:(NSMenu *); Selektor.NSMenu Gepresste Maustaste in 10.5

Für 10,6+ nutze ich die [NSEvent pressedMouseButtons], die mir ermöglicht, die gedrückte Taste außerhalb des Ereignisstroms zu bekommen. Dies ist jedoch nicht in 10.5+ existiert (es scheint, ich brauche [theEvent buttonNumber] zu nennen

Wie ich die gedrückte Maustaste (rechts oder links) erfasse.

  1. Innerhalb meiner NSMenu Delegierten
  2. vorzugsweise innerhalb der -(void)menuWillOpen:(NSMenu *)menu Selektor
  3. in einem Herrenhaus, das sowohl in der 10.5+ und 10.6+

arbeitet schätze ich wirklich die Hilfe und wissen, Stackoverflow wird einem neuen Objective-C-Programmierer helfen!

Danke, Dustin

+0

dass der beste Weg ist, es zu tun, aber man kann einfach nutzen [[NSApp currentEvent] buttonNumber].NSApp ist eine globale Variable, die auf das Anwendungsobjekt verweist. – ughoavgfhw

+0

Dustin Senos: Du solltest das als Antwort auf deine eigene Frage posten. Ich habe es aufgegriffen. –

Antwort

6

Am Ende konnte ich die aktuelle Maustaste erhalten, indem (dank Nick Paulson für die Hilfe) Aufruf:

[[[NSApplication sharedApplication] currentEvent] buttonNumber]

Wie ughoavgfhw ist aber das gleiche Ereignis des Abrufens einen kürzeren Weg wies darauf hin:

[[NSApp currentEvent] buttonNumber]

+1

Wollte diese Antwort für diejenigen hinzufügen, die Unterstützung für ältere Maschinen hinzufügen. Stellen Sie sicher, dass Sie nicht nur nach der rechten Maustaste suchen (die auf einem älteren Computer vorhanden sein kann), sondern auch, ob der Benutzer beim Klicken die Strg-Taste gedrückt hält (wird häufig auf älteren Maschinen zum Umschalten eines Kontextmenüs verwendet)): 'if ([[NSApp currentEvent] modifierFlags] & NSControlKeyMask) {... do code}' –

2

Eine andere Möglichkeit wäre, eine CGEventTap zu erstellen, die Ereignisse Maus nach unten erfasst.
Sie müssen dann nur den letzten Ereignistyp merken und das in einer Ihrer NSMenu-Delegiertenmethoden überprüfen.
Hier ist ein Code Beispiel:

CGEventRef MouseClickedEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void* refcon) 
{ 
    CGPoint location = CGEventGetLocation(event); 
    switch (type) 
    { 
     case kCGEventLeftMouseDown: 
     { 
      NSLog(@"Left Mouse pressed at %@", NSStringFromPoint(NSPointFromCGPoint(location))); 
      break; 
     }   
     case kCGEventRightMouseDown: 
     { 
      NSLog(@"Right Mouse pressed at %@", NSStringFromPoint(NSPointFromCGPoint(location))); 
      break; 
     } 
     case kCGEventOtherMouseDown: 
     { 
      NSLog(@"Other Mouse pressed at %@", NSStringFromPoint(NSPointFromCGPoint(location))); 
      break;   
     } 
     default: 
      break; 
    } 
    return event; 
} 

- (void)applicationDidFinishLaunching:(NSNotification*)aNotification 
{ 
    CGEventMask eventMask = CGEventMaskBit(kCGEventLeftMouseDown)|CGEventMaskBit(kCGEventRightMouseDown)|CGEventMaskBit(kCGEventOtherMouseDown); 
    CFMachPortRef eventTap = CGEventTapCreate(kCGSessionEventTap, kCGHeadInsertEventTap, 0, eventMask, MouseClickedEventCallback, NULL); 
    CFRunLoopSourceRef runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0); 
    CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes); 
    CGEventTapEnable(eventTap, true); 
} 

Der Quartz Event Services docs heißt es:

Ereignis Taps erhalten Taste nach oben und Taste gedrückt Ereignisse, wenn eine der folgenden Bedingungen erfüllt ist:

  • Der aktuelle Prozess läuft als Root-Benutzer.
  • Zugriff für assistive Geräte ist aktiviert. Unter Mac OS X 10.4, können Sie diese Funktion unter Verwendung von Systemeinstellungen, Universal Access Panel, Tastaturansicht aktivieren.

Ich habe, dass verdoppeln und es scheint, dass Sie wirklich Mausereignisse nicht Hilfsmittel ermöglichen müssen erhalten. Wenn [[[NSApplication sharedApplication] currentEvent] buttonNumber] macht, was Sie wollen, würde ich definitiv damit gehen. Es ist ein höheres Level und daher weniger Code.

+0

Wirklich zu schätzen die Hilfe/Code Weichsel, es ist immer gut, verschiedene Ansätze für das gleiche Problem zu sehen. Wie Sie bereits gesagt haben, macht der '[NSApplication sharedApplication]' -Ansatz, was ich will, und ist auf einer höheren Ebene, also werde ich es vorläufig gehen. –

+0

Das hat enorm geholfen. Vielen Dank! –