2012-02-16 14 views
6

In Mac OS/Cocoa, si può sintetizzare le voci della tastiera - stringhe - per l'applicazione in primo piano in modo trasparente?Generare eventi di tastiera per l'applicazione in primo piano

Per essere più precisi, non voglio inviare caratteri speciali o sequenze di controllo. Il mio unico bisogno è di inviare caratteri standard.

appena appreso here, che AppleScript può fare il trucco in questo modo:

tell application "TextEdit" 
    activate 

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

D: Come posso fare questo usando objC/cacao?

UPDATE 2012-02-18 - proposta Nicks rafforzata

Basato sul codice Nick s' al di sotto, ecco la soluzione definitiva:

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

Utilizzando questo metodo, un clic su un il pulsante di un pannello non attivo indirizza l'evento all'applicazione frontale effettiva. Perfettamente quello che voglio fare

risposta

10

Certo, ti consigliamo di utilizzare CGEventCreateKeyboardEvent per creare eventi della tastiera, poi mettile in quanto tale:

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

è un po 'più complicato di AppleScript, ma fa il trucco. Si do devono pubblicare esplicitamente un keydown e quindi un evento keyup. Maggiori informazioni allo Quartz Event Services Reference.

+0

Grazie! Mai fatto nulla a un livello così basso. – SteAp