Получение “глобального” положения мыши в Mac OS X

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

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

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

18
задан radex 14 February 2010 в 19:55
поделиться

2 ответа

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

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

32
ответ дан 30 November 2019 в 05:48
поделиться

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

29
ответ дан 30 November 2019 в 05:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: