teclado eventos objective-c macos cocoa

objective-c - eventos de teclado en java netbeans



Generar eventos de teclado para la aplicaciĆ³n principal (1)

En Mac OS / Cocoa, ¿puedo sintetizar entradas de teclado (cadenas) para la aplicación principal de forma transparente?

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

Acabo de aprender aquí , que AppleScript puede hacer el truco así:

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

P: ¿Cómo haría esto usando ObjC / cocoa?

ACTUALIZACIÓN 2012-02-18 - Propuesta de Nicks mejorada

Basado en el código de Nick a continuación, 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);

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


Claro, querrá usar CGEventCreateKeyboardEvent para crear eventos de teclado y luego publicarlos como tales:

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 funciona. Tienes que publicar explícitamente una tecla y luego un evento de tecla. Más información en Quartz Event Services Reference .