2010-03-04 4 views
13

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

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

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

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

Любые идеи?

ответ

24

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

+0

Итак, в этом примере, 'CGKeyCode'' 1' является кодом для S? Кроме того, будет ли это работать только для приложения переднего плана или если оно работает в фоновом режиме, будет ли оно работать на протяжении всего сеанса? Спасибо – joec

+0

@joec да всем этим. –

+0

Итак, скажем, мое приложение работало в фоновом режиме (как служба), и у меня был Photoshop спереди, я мог имитировать нажатие клавиши, и это было бы видно в Photoshop? Спасибо – joec

2

Только в случае, если кто-то нуждается в 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: паста).

Смежные вопросы