Я лихорадочно искал метод, с помощью которого можно ограничить мышь пользователя одним дисплеем в настройке с несколькими дисплеями на 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 пикселей.
Есть идеи?