Cocoa: получение текущей позиции мыши на экране

Мне нужно получить положение мыши на экране на Mac с помощью Xcode. У меня есть код, который якобы делает это, но я всегда возвращаю x и y как 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);    

}

Что я делаю неправильно? Как получить текущую позицию на экране? Кроме того, в конечном итоге эта позиция (сохраненная в NSPoint) должна быть скопирована в CGPoint для использования с другой функцией, поэтому мне нужно получить это либо как координаты x, y, либо перевести это.


person wonderer    schedule 12.07.2009    source источник
comment
Понятно: CGEventRef ourEvent = CGEventCreate(NULL); точка = CGEventGetLocation (наше событие); NSLog(@Location? x= %f, y = %f, (с плавающей запятой)точка.x, (с плавающей запятой)точка.y);   -  person wonderer    schedule 13.07.2009
comment
Я не понимаю, почему ваш первоначальный код не работал, этот код прекрасно работает для меня.   -  person Mecki    schedule 04.11.2009


Ответы (5)


Исходный код автора не работает, потому что он/она пытается напечатать числа с плавающей запятой как %d. Правильный код будет:

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

Вам не нужно идти в Carbon, чтобы сделать это.

person MarcWan    schedule 09.12.2009
comment
Это Quartz Event Services, а не Carbon, но в остальном вы правы: Cocoa прекрасно справится с этой задачей, не создавая объект CGEvent. - person Peter Hosey; 09.12.2009
comment
Упс, будучи парнем на 99% какао, я не очень хорошо разбираюсь в номенклатуре того, что внизу. Спасибо за разъяснения :) - person MarcWan; 10.12.2009
comment
могу ли я получить начальную точку, конечную точку, высоту, ширину .... так же, как на экране - person Maulik shah; 10.11.2015

Остерегайтесь смешивания среды NS со средой CG. Если вы получаете местоположение мыши с помощью метода NS mouseLocation, то используйте CGWarpMouseCursorPosition(cgPoint), вы не будете отправлены в точку на экране, которую вы ожидали. Проблема возникает из-за того, что CG использует левый верхний угол как (0,0), а NS использует левый нижний угол как (0,0).

person user3581648    schedule 28.04.2014
comment
могу ли я получить начальную точку, конечную точку, высоту, ширину .... так же, как на экране - person Maulik shah; 10.11.2015

Ответ на этот вопрос в Swift

let currentMouseLocation = NSEvent.mouseLocation()
let xPosition = currentMouseLocation.x
let yPosition = currentMouseLocation.y
person Andre Yonadam    schedule 28.05.2016
comment
Pos from topLeft: CGPoint(NSEvent.mouseLocation().x,abs(NSEvent.mouseLocation().y + -NSScreen.mainScreen()!.visibleFrame.height)) - person Sentry.co; 19.08.2016
comment
@Andre Как я могу получать информацию каждый раз, когда mouseLocation меняется? - person ixany; 05.02.2017
comment
@ixany Вам нужно будет реализовать события mouseDragged, mouseEntered и mouseExited. Это будет работать для окна самого приложения. - person Andre Yonadam; 26.03.2017
comment
К вашему сведению, если у вас есть источник событий NSEvent и вам нужны координаты компьютерной графики, я смог преобразовать их в координаты GCEvent следующим образом: let mouseLocEvent = CGEvent.init(source: eventSource); return mouseLocEvent!.location. В моем случае это предотвратило телепортацию мыши. - person Jason Denney; 17.11.2018

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

NSLog верно;

person Vladimir Prigarin    schedule 12.02.2016

person    schedule
comment
Не забудьте выпустить этот CGEventRef! - person kperryua; 13.07.2009
comment
как ответил marcwan, пример в вопросе не работает из-за ошибки с NSLog, в остальном все в порядке. - person Steph Thirion; 19.05.2010
comment
могу ли я получить начальную точку, конечную точку, высоту, ширину .... так же, как на экране - person Maulik shah; 10.11.2015