2011-01-16 7 views
8

¿Es posible que una ventana en un escritorio de Mac envíe programáticamente un atajo de teclado o secuencia de teclas a otro?Enviar un atajo de teclado a una ventana de Mac OS X

Estoy buscando controlar una aplicación que no ofrece ninguna API para hacer eso, mediante el uso de las funciones de acceso directo de teclado de la aplicación.

Estoy bastante seguro de que esto se puede hacer en Windows, ¿pero Mac?

Gracias

Respuesta

13

Una forma de hacer esto está incorporando Applescript en su aplicación Objective-C. Por ejemplo la ejecución de este script manzana, envía Comando + M a System Events aplicación:

tell application "System Events" to keystroke "m" using {command down} 

Puede incrustar la secuencia de comandos en su aplicación Cocoa con algo como esto:

//AppControler.h 
#import <Cocoa/Cocoa.h> 

@interface AppController : NSObject { 
    NSAppleScript *key; 
} 
-(IBAction)sendkeys:(id)sender; 
@end 

//AppControler.m 
#import "AppController.h" 

@implementation AppController 

-(IBAction)sendkeys:(id)sender 
{ 
    NSAppleScript *key = [[NSAppleScript alloc] initWithSource:@"tell application "System Events" to keystroke "m" using {command down}"]; 
    [start executeAndReturnError:nil]; 
} 

@end 
+0

perfecto. Para cualquier otra persona que mire esto, los documentos de Apple en AppleScript parecen útiles. http://developer.apple.com/library/mac/#documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html. Muchas gracias – Adam

15

Usted puede hacer esto sin necesidad de AppleScript también. Aquí hay un ejemplo de código de trabajo que envía un código de tecla con modificadores.

-Edit: esto no va a dejar que usted apunta una aplicación específica, sólo colocar las pulsaciones de teclado a todo el sistema (como si se pulsa en un teclado)

#include <ApplicationServices/ApplicationServices.h> 
// you can find key codes in <HIToolbox/Events.h>, for example kVK_ANSI_A is 'A' key 
// modifiers are flags such as kCGEventFlagMaskCommand 

void PostKeyWithModifiers(CGKeyCode key, CGEventFlags modifiers) 
{ 
     CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateCombinedSessionState); 

     CGEventRef keyDown = CGEventCreateKeyboardEvent(source, key, TRUE); 
     CGEventSetFlags(keyDown, modifiers); 
     CGEventRef keyUp = CGEventCreateKeyboardEvent(source, key, FALSE); 

     CGEventPost(kCGAnnotatedSessionEventTap, keyDown); 
     CGEventPost(kCGAnnotatedSessionEventTap, keyUp); 

     CFRelease(keyUp); 
     CFRelease(keyDown); 
     CFRelease(source); 
} 
+1

Buena idea, pero ¿cómo envía el OP a un proceso objetivo por separado? – BigBrother

+0

¿Por qué esto no funciona con NX_KEYTYPE_PLAY? Solo imprime "y" – jLynx