2010-12-19 18 views
5

Estoy actualizando (¿una fecha anterior?) Una aplicación que he escrito para 10.6+ para trabajar en 10.5+. Tengo dificultades para capturar el botón del mouse actualmente presionado en el selector -(void)menuWillOpen:(NSMenu *);.Botón del mouse presionado NSMenu en 10.5

Para 10.6+ Estoy aprovechando el [NSEvent pressedMouseButtons] que me permite obtener el botón presionado fuera de la secuencia del evento. Sin embargo, esto no existe en 10.5 + (parece que necesito para llamar [theEvent buttonNumber]

¿Cómo capturo pulsado el botón del ratón (derecha o izquierda):.

  1. Dentro de mi delegado NSMenu
  2. Preferentemente en el interior del selector de -(void)menuWillOpen:(NSMenu *)menu
  3. en una casa que funciona tanto en 10.5 + y 10.6+

realmente aprecio la ayuda y saben Stackoverflow ¡ayudará a un nuevo programador de Objective-C a salir!

Gracias, Dustin

+0

Esa es la mejor manera de hacerlo, pero sólo puede usar [[NSApp currentEvent] buttonNumber].NSApp es una variable global que apunta al objeto de la aplicación. – ughoavgfhw

+0

Dustin Senos: Debería publicar eso como respuesta a su propia pregunta. Yo lo hubiera votado. –

Respuesta

6

Al final yo era capaz de conseguir el botón actual del ratón llamando al (gracias a Nick Paulson por la ayuda):

[[[NSApplication sharedApplication] currentEvent] buttonNumber]

Como ughoavgfhw señaló un camino más corto de ir a buscar el mismo evento es sin embargo:

[[NSApp currentEvent] buttonNumber]

+1

Quería agregar a esta respuesta para aquellos que están agregando soporte para máquinas más antiguas. Asegúrese de que no solo está buscando el botón derecho del mouse (que puede existir o no en una máquina más antigua) pero verifica si el usuario mantiene presionada la tecla de control al hacer clic (a menudo se usa en máquinas antiguas para alternar un menú contextual): 'if ([[NSApp currentEvent] modifierFlags] & NSControlKeyMask) {... do code}' –

2

Otra forma sería la creación de un CGEventTap que captura los eventos del ratón.
Luego solo tiene que recordar el último tipo de evento y verificarlo en uno de sus métodos de delegado NSMenu.
Aquí hay un código de ejemplo:

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); 
} 

El Quartz Event Services docs estado que:

grifos de eventos recibe la llave y clave abajo eventos si uno de los condiciones siguientes es verdadera:

  • El proceso actual se ejecuta como el usuario root .
  • Se habilita el acceso para dispositivos de asistencia . En Mac OS X v10.4, , puede habilitar esta función usando Preferencias del sistema, Acceso universal panel, Vista del teclado.

Me doble comprobado que y parece que realmente no tiene que permitir que los dispositivos de asistencia para recibir eventos de ratón.

Pero si [[[NSApplication sharedApplication] currentEvent] buttonNumber] hace lo que quiere, definitivamente me iría con eso. Es un nivel más alto y, por lo tanto, menos código.

+0

Realmente aprecio la ayuda/código weichsel, siempre es bueno ver diferentes enfoques para el mismo problema. Como dijiste, el enfoque '[NSAplication sharedApplication]' está haciendo lo que yo quiero, y es de un nivel más alto, así que lo voy a hacer por el momento. –

+0

Esto ayudó enormemente. ¡Gracias! –

Cuestiones relacionadas