2012-02-16 3 views
6

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

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

Только узнал here, что AppleScript может сделать трюк, как это:

tell application "TextEdit" 
    activate 

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

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

UPDATE 2012-02-18 - Никс предложение повысить

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

// 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); 

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

ответ

10

Конечно, вы хотите использовать 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 Reference.

+0

Спасибо! Никогда не делал ничего на таком низком уровне. – SteAp