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.
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
Dustin Senos: Debería publicar eso como respuesta a su propia pregunta. Yo lo hubiera votado. –