2009-07-12 10 views
26

J'ai besoin d'obtenir la position de la souris sur l'écran d'un Mac en utilisant Xcode. J'ai un code qui est censé faire ça, mais je retourne toujours x et y 0:Cocoa: Obtenir la position actuelle de la souris sur l'écran

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'est-ce que je fais mal? Comment obtenez-vous la position actuelle sur l'écran? En outre, en fin de compte, cette position (enregistrée dans un NSPoint) doit être copiée dans un CGPoint pour être utilisée avec une autre fonction, donc je dois l'obtenir en coordonnées x, y ou traduire cela.

+1

Got it: CGEventRef ourEvent = CGEventCreate (NULL); point = CGEventGetLocation (ourEvent); NSLog (@ "Emplacement? X =% f, y =% f", (flottant) point.x, (flottant) point.y); – wonderer

+0

Je ne vois pas pourquoi votre code initial ne fonctionnait pas, ce code fonctionne très bien pour moi. – Mecki

Répondre

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

N'oubliez pas de libérer ce CGEventRef! – kperryua

+0

Merci pour le conseil! – wonderer

+0

comme marcwan a répondu, l'exemple dans la question ne fonctionne pas en raison d'une erreur avec NSLog, le reste est bien. –

55

Le code original de l'auteur ne fonctionne pas car il tente d'imprimer des valeurs flottantes en% d. Le code correct serait:

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

Vous n'avez pas besoin d'aller à Carbon pour ce faire.

+4

C'est Quartz Event Services, pas Carbon, mais sinon vous avez raison: Cocoa fera bien ce travail, sans créer de Objet CGEvent. –

+1

Oups, étant moi-même un gars du cacao 99%, je ne suis pas très bon avec la nomenclature des choses en dessous. Merci pour la clarification :) – MarcWan

+0

puis-je obtenir point de départ, point final, hauteur, largeur .... tout comme sur l'écran rular –

10

Attention au mélange de l'environnement NS avec l'environnement CG. Si vous obtenez l'emplacement de la souris avec la méthode mouseLocation NS, alors utilisez CGWarpMouseCursorPosition (cgPoint), vous ne serez pas envoyé au point que vous attendiez sur l'écran. Le problème résulte de CG utilisant le haut à gauche comme (0,0) tandis que NS utilise le bas à gauche comme (0,0).

+0

puis-je obtenir le point de départ, le point final, la hauteur, la largeur .... tout comme sur screen rular –

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

NSLog est vrai;

5

La réponse à cette question Swift

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

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

+0

@Andre Comment puis-je être informé à chaque fois le 'mouseLocation' a-t-il changé? – ixany

+0

@ixany Vous devez implémenter les événements mouseDragged, mouseEntered et mouseExited. Cela fonctionnera pour la fenêtre de l'application elle-même. –