Получение "глобальной" позиции мыши в Mac OS X

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

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

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

5 ответов


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

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


Matt S. правильно, что если вы можете использовать NSEvent API, чтобы получить расположение мыши. Однако вам не нужно опрашивать, чтобы постоянно получать координаты. Вы можете использовать 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) когда вы закончите.


Если вы не в cocoa land и событие крана не подходит для ситуации,

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

строительство.


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


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