2012-02-16 6 views
6

En Mac OS/Cocoa, ¿puedo sintetizar entradas de teclado - cadenas - para la aplicación frontal de forma transparente?Generar eventos de teclado para la aplicación más avanzada

Para ser más precisos, no deseo enviar caracteres especiales o secuencias de control. Mi única necesidad es enviar caracteres estándar.

acaba de aprender here, que AppleScript puede hacer el truco de esta manera:

tell application "TextEdit" 
    activate 

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

Q: ¿Cómo puedo hacer esto usando ObjC/cacao?

ACTUALIZACIÓN 2012-02-18 - propuesta Nicks mejorado

basado en el código Nick 's más adelante, aquí está la solución final:

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

Usando este método, un clic en una El botón de un panel que no se activa apunta el evento a la aplicación frontal real. Perfectamente lo que quiero hacer.

Respuesta

10

Claro, usted querrá usar CGEventCreateKeyboardEvent para crear eventos de teclado, a continuación, publicarlos como tal:

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

Es un poco más complicado que AppleScript pero hace el truco. Usted do tiene que publicar explícitamente un keydown y luego un evento de keyup. Más información en el Quartz Event Services Reference.

+0

¡Gracias! Nunca hice nada a un nivel tan bajo. – SteAp

Cuestiones relacionadas