Ограничение мыши одним дисплеем на Mac (возможно, с использованием какао)

Я лихорадочно искал метод, с помощью которого можно ограничить мышь пользователя одним дисплеем в настройке с несколькими дисплеями на Mac .

Я наткнулся на этот вопрос: Какао: ограничить экран мышью , обещаю, я не дублировал этот вопрос.

Однако этот вопрос вызвал у меня мысль, что можно было бы написать простое приложение с использованием Какао, чтобы ограничить мышь одним экраном, запустить это приложение в фоновом режиме и по-прежнему использовать мою игру, которая была разработан в AS3 / Adobe AIR / Flash.

Игра является полноэкранной и всегда будет иметь одинаковое разрешение на одном и том же мониторе. Другой монитор также всегда будет иметь такое же разрешение, но он будет просто неинтерактивным отображением информации. Мне нужно, чтобы пользователь мог взаимодействовать с игрой, но не убирал случайно мышь с экрана игры.

Резюме вопроса: Могу ли я создать базовое приложение для Mac OS X (Lion) с использованием Cocoa / Objective C, которое ограничит использование мыши одним монитором, который можно запускать В ФОНОВОМ ФОНЕ и не позволять пользователям от перемещения мыши за пределы монитора, на котором будет запущена полноэкранная игра?


[ РЕДАКТИРОВАТЬ:] Я нашел базовый код, необходимый для запуска цикла для Quartz Event Filter, благодаря этому ответу: Измените NSEvent, чтобы отправить ключ, отличный от того, который был нажат

Я собираюсь использовать этот код для целей тестирования, и я немного изменил его, чтобы обнаруживать события мыши следующим образом:

CGEventRef mouse_filter(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {

    NSPoint point = CGEventGetLocation(event);
    NSPoint target = NSMakePoint(100,100);
    if (point.x >= 500){
        CGEventSetLocation(event,target);

    }
    return event;
}

int main(int argc, char *argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    CFRunLoopSourceRef runLoopSource;

    CFMachPortRef eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, kCGEventTapOptionDefault, kCGEventMouseMoved, mouse_filter, NULL);

    if (!eventTap) {
        NSLog(@"Couldn't create event tap!");
        exit(1);
    }

    runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0);

    CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes);

    CGEventTapEnable(eventTap, true);

    CFRunLoopRun();

    CFRelease(eventTap);
    CFRelease(runLoopSource);
    [pool release];

    exit(0);
}

Это, однако, похоже, работает не совсем правильно. Он определенно правильно определяет события мыши, а также правильно перемещает события. Например, если я перетащу окно за пределы 500 пикселей от левого края экрана, событие перетаскивания окна переместится на 100,100. Однако сама мышь не перемещается в новое место, когда она просто перемещается по экрану, не выполняя никаких других действий. IE: Вы по-прежнему можете перемещать мышь по всему экрану, а не только в левом столбце размером 500 пикселей.

Есть идеи?

5
задан Community 23 May 2017 в 11:58
поделиться