Cocoa: Obtener la posición actual del ratón en la pantalla


Necesito obtener la posición del ratón en la pantalla de un Mac usando Xcode. Tengo algún código que supuestamente hace eso, pero siempre devuelve x e y como 0:

void queryPointer()
{

    NSPoint mouseLoc; 
    mouseLoc = [NSEvent mouseLocation]; //get current mouse position

    NSLog(@"Mouse location:");
    NSLog(@"x = %d",  mouseLoc.x);
    NSLog(@"y = %d",  mouseLoc.y);    

}

¿Qué estoy haciendo mal? ¿Cómo se obtiene la posición actual en la pantalla? Además, en última instancia, esa posición (guardada en un NSPoint) necesita ser copiada en un CGPoint para ser utilizada con otra función,por lo que necesito obtener esto ya sea como coordenadas x, y o traducir esto.

Author: Gilles, 2009-07-13

5 answers

El código original del autor no funciona porque está intentando imprimir flotadores como %d. El código correcto sería:

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

No necesitas ir a Carbon para hacer esto.

 57
Author: MarcWan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-13 15:56:06
CGEventRef ourEvent = CGEventCreate(NULL);
point = CGEventGetLocation(ourEvent);
CFRelease(ourEvent);
NSLog(@"Location? x= %f, y = %f", (float)point.x, (float)point.y);
 24
Author: wonderer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-26 17:36:22

Tenga cuidado de mezclar el entorno NS con el entorno CG. Si obtiene la ubicación del mouse con el método NS mouseLocation, use CGWarpMouseCursorPosition (CGPoint) no se le enviará al punto de la pantalla que esperaba. El problema resulta de CG usando top left as (0,0) mientras que NS usa bottom left as (0,0).

 12
Author: user3581648,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-28 14:20:12

La respuesta a esta pregunta en Swift

let currentMouseLocation = NSEvent.mouseLocation()
let xPosition = currentMouseLocation.x
let yPosition = currentMouseLocation.y
 5
Author: Andre Yonadam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-28 05:57:58
NSLog(@"%@", NSStringFromPoint(point));

NSLog es verdadero;

 0
Author: Vladimir Prigarin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-12 12:11:17