Генерировать события клавиатуры для самого первого приложения

В Mac OS/ Cocoa могу ли я синтезировать записи клавиатуры - строки - для самого первого приложения прозрачным способом?

Чтобы быть более точным, я не хочу отправлять специальные символы или контрольные последовательности. Моя единственная потребность - отправлять стандартные символы.

Просто узнал здесь, что AppleScript может сделать трюк следующим образом:

tell application "TextEdit"
    activate

    tell application "System Events"
        keystroke "f" using {command down}
    end tell
end tell

Q: Как мне это сделать, используя ObjC/ cocoa?

ОБНОВЛЕНИЕ 2012-02-18 - Улучшено предложение ников

Основываясь на Nick ниже, вот окончательное решение:

// First, get the PSN of the currently front app
ProcessSerialNumber psn;
GetFrontProcess( &psn );

// make some key events
CGEventRef keyup, keydown;
keydown = CGEventCreateKeyboardEvent (NULL, (CGKeyCode)6, true);
keyup = CGEventCreateKeyboardEvent (NULL, (CGKeyCode)6, false);

// forward them to the frontmost app
CGEventPostToPSN (&psn, keydown); 
CGEventPostToPSN (&psn, keyup); 

// and finally behave friendly
CFRelease(keydown);
CFRelease(keyup);

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

Ответ 1

Конечно, вы захотите использовать CGEventCreateKeyboardEvent для создания событий клавиатуры, а затем опубликовать их как таковые:

    CGEventRef keyup, keydown;
    keydown = CGEventCreateKeyboardEvent (NULL, (CGKeyCode)56, true);
    keyup = CGEventCreateKeyboardEvent (NULL, (CGKeyCode)56, false);

    CGEventPost(kCGHIDEventTap, keydown);
    CGEventPost(kCGHIDEventTap, keyup);
    CFRelease(keydown);
    CFRelease(keyup);

Это немного сложнее, чем AppleScript, но это трюк. Вы должны явно опубликовать keydown, а затем событие keyup. Более подробную информацию можно найти в Кварцевые службы служб событий.