Имитация событий нажатия клавиш в 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);
CGKeyCode
не более чем целое число без знака:
typedef uint16_t CGKeyCode; //From CGRemoteOperation.h
Ваша настоящая проблема будет превращение персонажа (вероятно, NSString
) в код ключа. К счастью, у проекта Shortcut Recorder есть код, который будет делать именно это в SRKeyCodeTransformer.m
файл. Отлично подходит для преобразования строки в код клавиши и обратно.
На всякий случай, если кому-то нужна версия Swift:
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 (AKA: вставка).