Получение "глобальной" позиции мыши в 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