Имитация событий нажатия клавиш в Mac OS X - PullRequest
13 голосов
/ 04 марта 2010

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

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

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

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

Есть идеи?

Ответы [ 2 ]

24 голосов
/ 04 марта 2010

Вот код для имитации действия 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. Отлично подходит для преобразования строки в код клавиши и обратно.

3 голосов
/ 27 июля 2016

На всякий случай, если кому-то нужна версия 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: вставка).

...