2010-02-14 21 views
15

¿Cómo puedo obtener la posición de mouse "global" de Mac OS X? Quiero decir cómo puedo en cocoa/cf/lo que encuentre la posición del cursor incluso si está fuera de la ventana, y incluso si mi ventana está inactiva?Obteniendo la posición "global" del mouse en Mac OS X

Sé que es posible de alguna manera (incluso sin permisos de administrador), porque he visto algo así en Java - pero quiero escribirlo en ObjC

Lo siento por mi Inglés - espero que lo entienda lo que quiero decir;)

+0

posible duplicado de http://stackoverflow.com/questions/1117065/cocoa-getting-the-current-mouse-position-on- the-screen – outis

Respuesta

27
NSPoint mouseLoc; 
mouseLoc = [NSEvent mouseLocation]; //get current mouse position 
NSLog(@"Mouse location: %f %f", mouseLoc.x, mouseLoc.y); 

Si lo desea conseguir de forma continua las coordenadas a continuación, asegúrese de que tiene una NSTimer o algo similar

+0

wow, gracias! No sabía que es así de simple. Pensé que NSEvent me daría solo la posición de ratón en la ventana. Voy a aceptar tu respuesta mañana, después de probar que funciona de la manera que quiero. – radex

+0

Gracias. ¿Hay alguna forma de averiguar en qué pantalla se encuentra el mouse? – adib

+1

@adib - use [pantallas NSScreen] e itere a través del resultado, usando NSPointInRect para probar –

29

Matt S. es cierto que si se puede usar la API para obtener NSEvent la ubicación del mouse Sin embargo, no tiene que sondear para obtener coordenadas continuamente. Puede utilizar un CGEventTap lugar:

- (void) startEventTap { 
    //eventTap is an ivar on this class of type CFMachPortRef 
    eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, kCGEventTapOptionListenOnly, kCGEventMaskForAllEvents, myCGEventCallback, NULL); 
    CGEventTapEnable(eventTap, true); 
} 

CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) { 
    if (type == kCGEventMouseMoved) { 
     NSLog(@"%@", NSStringFromPoint([NSEvent mouseLocation])); 
    } 

    return event; 
} 

esta manera, su función myCGEventCallback disparará cada vez que se mueve el ratón (sin importar si su aplicación es en primer plano o no), sin tener que sondear en busca de la información. No se olvide de CGEventTapEnable(eventTap, false) y CFRelease(eventTap) cuando haya terminado.

+1

Me gusta este método :) Es mucho mejor que el mío –

+0

No funciona para mí :(No tengo idea de por qué, no apareció ninguna salida. – radex

+0

bien, no importa. Tu solución es probablemente mejor, pero no funciona. Solo usaré [NSEvent mouseLocation];) Gracias de todos modos – radex

6

Si no estás en la tierra de cacao y un grifo de evento no es apropiado para la situación,

CGEventRef event = CGEventCreate(nil); 
CGPoint loc = CGEventGetLocation(event); 
CFRelease(event); 

obras.

2

Matt es correcto, pero para obtener continuamente las coordenadas, creo que la otra opción es usar el monitor de eventos proporcionado por NSEvent. Pruebe addGlobalMonitorForEventsMatchingMask:handler: y addLocalMonitorForEventsMatchingMask:handler:. Compruebe NSEvent Class Reference para más detalles.

Cuestiones relacionadas