2009-07-12 33 views
26

Necesito obtener la posición del mouse en la pantalla en una Mac usando Xcode. Tengo un código que supuestamente hace eso, pero yo siempre devuelve x e y como 0:Cocoa: Obteniendo la posición actual del mouse en la pantalla

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) debe copiarse en un CGPoint para ser utilizada con otra función, así que necesito obtener esto como coordenadas x, y o traducir esto.

+1

Entendido: CGEventRef ourEvent = CGEventCreate (NULL); point = CGEventGetLocation (ourEvent); NSLog (@ "Ubicación? X =% f, y =% f", (float) punto.x, (float) punto.y); – wonderer

+0

No veo por qué su código inicial no funciona, este código funciona muy bien para mí. – Mecki

Respuesta

23
CGEventRef ourEvent = CGEventCreate(NULL); 
point = CGEventGetLocation(ourEvent); 
CFRelease(ourEvent); 
NSLog(@"Location? x= %f, y = %f", (float)point.x, (float)point.y); 
+7

¡No olvide lanzar ese CGEventRef! – kperryua

+0

¡Gracias por el consejo! – wonderer

+0

como marcwan ha respondido, el ejemplo en la pregunta no funciona debido a un error con NSLog, el resto está bien. –

55

El código original del autor no funciona porque él/ella está tratando de imprimir flotantes 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 necesita ir a Carbon para hacer esto.

+4

Eso es Quartz Event Services, no de carbono, pero de lo contrario está en lo cierto: Cocoa hará bien este trabajo, sin crear un Objeto CGEvent. –

+1

Vaya, siendo un 99% cacao, no soy tan bueno con la nomenclatura de lo que está debajo. Gracias por la aclaración :) – MarcWan

+0

puedo obtener puntos punto de inicio, punto final, alto, ancho .... al igual que en la pantalla rular –

10

Tenga cuidado al mezclar el entorno NS con el entorno CG. Si obtiene la ubicación del mouse con el método de NS mouseLocation, entonces use CGWarpMouseCursorPosition (cgPoint) no será enviado al punto en la pantalla que esperaba. El problema resulta de CG usando la parte superior izquierda como (0,0) mientras que NS usa la parte inferior izquierda como (0,0).

+0

puedo obtener punto de inicio de punto, punto final, alto, ancho .... al igual que en screen rular –

0
NSLog(@"%@", NSStringFromPoint(point)); 

NSLog is true;

5

La respuesta a esta pregunta en Swift

let currentMouseLocation = NSEvent.mouseLocation() 
let xPosition = currentMouseLocation.x 
let yPosition = currentMouseLocation.y 
+0

Pos desde topLeft: CGPoint (NSEvent.mouseLocation(). x, abs (NSEvent.mouseLocation(). y + -NSScreen.mainScreen() !. visibleFrame.height)) – eonist

+0

@Andre ¿Cómo puedo estar informado todo el tiempo? el 'mouseLocation' ¿cambió? – ixany

+0

@ixany Debería implementar los eventos mouseDragged, mouseEntered y mouseExited. Esto funcionará para la ventana de la aplicación en sí. –

Cuestiones relacionadas