Обновление 10.6.3 os x сломало смоделированные нажатия клавиш для Nestopia - PullRequest
2 голосов
/ 01 апреля 2010

Приложение для iPhone, которое я выпустил, представляет собой беспроводной игровой контроллер, оно переводит прикосновения к устройству в нажатия клавиш на сетевом Mac. Это позволило играть в эмуляторные (например, Nestopia) игры, используя iPhone в качестве контроллера. Конечно, день, когда я выпустил его, совпал с обновлением os x. После установки этого обновления симулированные нажатия клавиш больше не работают в Nestopia! Сумасшедшая вещь заключается в том, что когда я иду в «Файл> Открыть» в Nestopia, я могу циклически перемещаться по списку файлов, нажимая стрелку вверх на моем контроллере iphone; т.е. симулированные нажатия клавиш работают в пунктах меню, но не в самой игре. Код, который я использую для имитации ключей, приведен ниже. Учитывая список изменений здесь , кто-нибудь может определить, какие изменения могут вызвать эту проблему?

Спасибо !!

#define UP  false
#define DOWN true

-(void)sendKey:(CGKeyCode)keycode andKeyDirection:(BOOL)keydirection{
  CGEventRef eventRef = CGEventCreateKeyboardEvent(NULL, keycode, keydirection);
  CGEventPost(kCGSessionEventTap, eventRef);
  CFRelease(eventRef);
}

Ответы [ 2 ]

2 голосов
/ 05 апреля 2010

Автор Mac Nestopia использует более старый вызов GetKeys () для захвата ключевых событий. Начиная с 10.6.3, GetKeys не перехватывает сгенерированные нажатия клавиш, используя методы, описанные в этом посте. Обходной путь, который я нашел, должен был использовать это вместо:

-(void)sendKey:(CGKeyCode)keycode andKeyDirection:(BOOL)keydirection{
  AXUIElementRef axSystemWideElement = AXUIElementCreateSystemWide();
  AXError err = AXUIElementPostKeyboardEvent(axSystemWideElement, 0, keycode, keydirection);
  if (err != kAXErrorSuccess)
    NSLog(@" Did not post key press!");
}

Огромное спасибо Ричарду Баннистеру за его быстрые ответы по электронной почте!

1 голос
/ 01 апреля 2010

Я думаю, что это проблема с вашим кодом, а не с 10.6.3. У меня есть приложение, которое я пишу, которое имитирует нажатия клавиш, и я обновился до 10.6.3, и мои симулированные нажатия клавиш по-прежнему работают очень хорошо.

Вот что я делаю:

CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateCombinedSessionState);
CGEventRef keyDownPress = CGEventCreateKeyboardEvent(source, (CGKeyCode)keyCode, YES);
CGEventSetFlags(keyDownPress, (CGEventFlags)flags);
CGEventRef keyUpPress = CGEventCreateKeyboardEvent(source, (CGKeyCode)keyCode, NO);

CGEventPost(kCGAnnotatedSessionEventTap, keyDownPress);
CGEventPost(kCGAnnotatedSessionEventTap, keyUpPress);

CFRelease(keyDownPress);
CFRelease(keyUpPress);
CFRelease(source);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...