Получение "глобальной" позиции мыши в Mac OS X
Как я могу получить "глобальную" позицию мыши в Mac OS X - я имею в виду, как я могу в cocoa/cf/what найти позицию курсора, даже если она находится за окном, и даже если мое окно неактивно?
Я знаю это как-то (даже без прав администратора), потому что я видел что-то подобное в Java, но я хочу записать его в ObjC
Извините за мой английский - надеюсь, вы поймете, что я имею в виду;)
Ответы
Ответ 1
NSPoint mouseLoc;
mouseLoc = [NSEvent mouseLocation]; //get current mouse position
NSLog(@"Mouse location: %f %f", mouseLoc.x, mouseLoc.y);
Если вы хотите, чтобы он постоянно получал координаты, убедитесь, что у вас есть NSTimer или что-то подобное
Ответ 2
Matt S. правильно, если вы можете использовать API NSEvent
, чтобы получить местоположение мыши. Тем не менее, вам не нужно проводить опрос, чтобы постоянно получать координаты. Вместо этого вы можете использовать CGEventTap
:
- (void) startEventTap {
//eventTap is an ivar on this class of type CFMachPortRef
eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, kCGEventTapOptionListenOnly, kCGEventMaskForAllEvents, myCGEventCallback, NULL);
CGEventTapEnable(eventTap, true);
}
CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {
if (type == kCGEventMouseMoved) {
NSLog(@"%@", NSStringFromPoint([NSEvent mouseLocation]));
}
return event;
}
Таким образом, ваша функция myCGEventCallback
будет срабатывать каждый раз, когда мышь перемещается (независимо от того, находится ли ваше приложение в начале или нет), без необходимости опроса информации. Не забывайте CGEventTapEnable(eventTap, false)
и CFRelease(eventTap)
, когда закончите.
Ответ 3
Если вы не находитесь в зоне cocoa, и кран события не подходит для этой ситуации,
CGEventRef event = CGEventCreate(nil);
CGPoint loc = CGEventGetLocation(event);
CFRelease(event);
работы.
Ответ 4
Мэтт прав, но для того, чтобы постоянно получать координаты, я считаю, что другой вариант - использовать монитор событий, предоставляемый NSEvent
. Попробуйте addGlobalMonitorForEventsMatchingMask:handler:
и addLocalMonitorForEventsMatchingMask:handler:
. Чтобы узнать подробнее, Ссылка на класс NSEvent.
Ответ 5
Для постоянного обновления позиции глобального курсора, вот как выглядит код (Swift 4.0.3):
override func viewDidLoad()
{
super.viewDidLoad()
NSEvent.addGlobalMonitorForEvents(matching: NSEvent.EventTypeMask.mouseMoved, handler: {(mouseEvent:NSEvent) in
let position = mouseEvent.locationInWindow
})
}
Обратите внимание, переменная 'position' является объектом NSPoint с координатами x и y (среди многих других атрибутов). Это не вернет координаты, если ваше приложение находится в фокусе или когда вы нажимаете и перетаскиваете. Для всех них существуют отдельные события: просто измените NSEvent.EventTypeMask.mouseMoved на другой EventTypeMask