2009-07-12 3 views
26

Ho bisogno di ottenere la posizione del mouse sullo schermo su un Mac utilizzando Xcode. Ho qualche codice che presumibilmente lo fa ma ho ritorna sempre xey come 0:Cacao: ottenere la posizione corrente del mouse sullo schermo

void queryPointer() 
{ 

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

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

} 

Che cosa sto facendo di sbagliato? Come si ottiene la posizione attuale sullo schermo? Inoltre, in ultima analisi, quella posizione (salvata in un NSPoint) deve essere copiata in un CGPoint da utilizzare con un'altra funzione, quindi ho bisogno di ottenere questo come x, y coordinate o tradurre questo.

+1

Capito: CGEventRef ourEvent = CGEventCreate (NULL); point = CGEventGetLocation (ourEvent); NSLog (@ "Posizione? X =% f, y =% f", (virgola mobile) point.x, (float) point.y); – wonderer

+0

Non riesco a capire perché il tuo codice iniziale non funzionava, questo codice funziona semplicemente per me. – Mecki

risposta

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

Non dimenticare di rilasciare quel CGEventRef! – kperryua

+0

Grazie per il consiglio! – wonderer

+0

come ha risposto Marcwan, l'esempio nella domanda non funziona a causa di un errore con NSLog, il resto va bene. –

55

Il codice originale dell'autore non funziona perché sta tentando di stampare float come% d. Il codice corretto sarebbe:

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

Non è necessario andare in Carbonio per fare ciò.

+4

Quella è Quartz Event Services, non Carbon, ma per il resto hai ragione: Cocoa farà questo lavoro bene, senza creare un Oggetto CGEvent. –

+1

Whoops, essendo io stesso un cacao al 99%, non sono molto bravo con la nomenclatura della roba sottostante. Grazie per il chiarimento :) – MarcWan

+0

posso ottenere punto di inizio punto, punto finale, altezza, larghezza .... proprio come sullo schermo rular –

10

Attenzione a mescolare l'ambiente NS con l'ambiente CG. Se si ottiene la posizione del mouse con il metodo NS mouseLocation, utilizzare CGWarpMouseCursorPosition (cgPoint) non verrà inviato al punto sullo schermo previsto. Il problema deriva da CG che utilizza in alto a sinistra come (0,0) mentre NS utilizza in basso a sinistra come (0,0).

+0

posso ottenere punto di inizio punto, punto finale, altezza, larghezza .... proprio come su screen rular –

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

NSLog è vero;

5

La risposta a questa domanda in Swift

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

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

+0

@Andre Come posso essere informato ogni volta il 'mouseLocation' è cambiato? – ixany

+0

@ixany È necessario implementare gli eventi mouseDragged, mouseEntered e mouseExited. Questo funzionerà per la finestra dell'applicazione stessa. –