2011-01-15 20 views
5

Estoy intentando aprender a codificar para la Mac. He sido un chico de Java por un tiempo, así que espero que el problema con el que me estoy encontrando sea un simple malentendido de Cocoa.addGlobalMonitorForEventsMatchingMask solo devolviendo la posición del mouse

Tengo el siguiente código:

-(IBAction)beginEventMonitor:(id)sender { 
    _eventMonitor = [NSEvent addGlobalMonitorForEventsMatchingMask:(NSLeftMouseUpMask) 
    handler:^(NSEvent *incomingEvent) { 
    //NSWindow *targetWindowForEvent = [incomingEvent window]; 
    NSLog(@"Got a mouse click event at %@", NSStringFromPoint([incomingEvent locationInWindow])); 
    }]; 
} 

-(IBAction)stopEventMonitor:(id)sender { 
    if (_eventMonitor) { 
    [NSEvent removeMonitor:_eventMonitor]; 
    _eventMonitor = nil; 
    } 
} 

Se trata de un simple gancho para decirme cuando un clic del ratón pasa a nivel global. El controlador está funcionando, pero el contenido del Evento entrante no parece establecerse en nada. La única información útil que puedo encontrar es la ubicación del mouse en el momento del clic y la ventana de la ventana en la que se hizo clic.

¿No debería poder obtener más información? ¿No estoy configurando el monitor correctamente? Realmente me gustaría poder saber en qué ventana se hizo clic, pero ni siquiera puedo encontrar la manera de convertir la ubicación del mouse o ventana en algo útil.

Respuesta

6

Puede recuperar más información acerca de la ventana utilizando las API CGWindow (nuevo en Leopard), por ejemplo:

CGWindowID windowID = (CGWindowID)[incomingEvent windowNumber]; 
CFArrayRef a = CFArrayCreate(NULL, (void *)&windowID, 1, NULL); 
NSArray *windowInfos = (NSArray *)CGWindowListCreateDescriptionFromArray(a); 
CFRelease(a); 
if ([windowInfos count] > 0) { 
    NSDictionary *windowInfo = [windowInfos objectAtIndex:0]; 
    NSLog(@"Name: %@", [windowInfo objectForKey:(NSString *)kCGWindowName]); 
    NSLog(@"Owner: %@", [windowInfo objectForKey:(NSString *)kCGWindowOwnerName]); 
    //etc. 
} 
[windowInfos release]; 

Hay mucha información ahí (mirada en CGWindow.h o hacer referencia a la documentación para disposición llaves). También hay funciones para crear capturas de pantalla de una sola ventana (que incluso funciona si está parcialmente cubierta por otra ventana), ¡cosas geniales!

+0

funciona muy bien con los eventos de mouse, ¿sabes algo para los eventos de KeyDown? –

Cuestiones relacionadas