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

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

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

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

tell application "TextEdit"
    activate

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

Q: Как бы я сделал это с помощью ObjC / какао?

обновление 2012-02-18-Никс предложение улучшено

на основе Никкод ниже, вот окончательное решение:

// 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, но это делает трюк. Вы do должны явно опубликовать keydown, а затем событие keyup. Более подробная информация на Quartz Event Services Справка.