Получение «глобальной» позиции мыши в Mac OS X - PullRequest
17 голосов
/ 14 февраля 2010

Как я могу получить в Mac OS X «глобальную» позицию мыши - я имею в виду, как я могу в какао / cf / что угодно узнать позицию курсора, даже если она находится за пределами окна, и даже если мое окно неактивно?

Я знаю, что это как-то возможно (даже без прав администратора), потому что я видел нечто подобное в Java - но я хочу написать это в ObjC

Извините за мой английский - надеюсь, вы поймете, о чем я;)

Ответы [ 5 ]

31 голосов
/ 14 февраля 2010
NSPoint mouseLoc;
mouseLoc = [NSEvent mouseLocation]; //get current mouse position
NSLog(@"Mouse location: %f %f", mouseLoc.x, mouseLoc.y);

Если вы хотите, чтобы он непрерывно получал координаты, убедитесь, что у вас есть NSTimer или что-то подобное

29 голосов
/ 14 февраля 2010

Мэтт С. прав, если вы можете использовать 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), когда закончите.

6 голосов
/ 16 августа 2011

Если вы находитесь не на земле какао, и событие не подходит для ситуации,

CGEventRef event = CGEventCreate(nil);
CGPoint loc = CGEventGetLocation(event);
CFRelease(event);

работает.

3 голосов
/ 05 августа 2015

Мэтт верен, но для непрерывного получения координат, я считаю, что другой вариант - использовать монитор событий, предоставленный NSEvent. Попробуйте addGlobalMonitorForEventsMatchingMask:handler: и addLocalMonitorForEventsMatchingMask:handler:. Проверьте Ссылка класса NSEvent для более подробной информации.

1 голос
/ 02 апреля 2018

Для непрерывного обновления глобальной позиции курсора, вот как выглядит код (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

...