Моделирование событий нажатия клавиш в Mac OS X

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

KEY_CODE_SHIFT или KEY_CODE_A - это как числовые константы, определенные где-то.

мне нужно взять эти константы и превратить их в CGKeyCode ценности.

моя текущая попытка использует код, подобный это так вопрос. Проблема в том, что он работает только для печатаемых символов. Если все остальное не удастся, я не выше жесткого кодирования преобразования, но это будет означать, что мне понадобится таблица возможных значений CGKeyCode, которые я еще не смог найти.

какие идеи?

2 ответов


вот код для имитации Cmd-S действие:

CGKeyCode inputKeyCode = kVK_ANSI_S;
CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateCombinedSessionState);
CGEventRef saveCommandDown = CGEventCreateKeyboardEvent(source, inputKeyCode, YES);
CGEventSetFlags(saveCommandDown, kCGEventFlagMaskCommand);
CGEventRef saveCommandUp = CGEventCreateKeyboardEvent(source, inputKeyCode, NO);

CGEventPost(kCGAnnotatedSessionEventTap, saveCommandDown);
CGEventPost(kCGAnnotatedSessionEventTap, saveCommandUp);

CFRelease(saveCommandUp);
CFRelease(saveCommandDown);
CFRelease(source);

A CGKeyCode - это не что иное, как целое число без знака:

typedef uint16_t CGKeyCode;  //From CGRemoteOperation.h

вашей реальной проблемой будет поворот персонажа (возможно,NSString) В ключ. К счастью,Shortcut Recorder проект имеет код, который будет делать именно это в SRKeyCodeTransformer.m. Это отлично подходит для преобразования строки в код ключа и обратно.


на всякий случай кому-то нужна быстрая версия:

XCode 7.3 и Swift 2.2:

let event1 = CGEventCreateKeyboardEvent(nil, 0x09, true); // cmd-v down
CGEventSetFlags(event1, CGEventFlags.MaskCommand);
CGEventPost(CGEventTapLocation.CGHIDEventTap, event1);

let event2 = CGEventCreateKeyboardEvent(nil, 0x09, false); // cmd-v up
CGEventSetFlags(event2, CGEventFlags.MaskCommand);
CGEventPost(CGEventTapLocation.CGHIDEventTap, event2);

код выше имитирует нажатый CMD-V, затем отпущенный(он же: вставить).