2011-01-16 2 views
8

Est-il possible qu'une fenêtre d'un bureau Mac envoie par programme un raccourci clavier ou une séquence de touches vers un autre?Envoyer un raccourci clavier à une fenêtre Mac OS X

Je cherche à contrôler une application qui n'offre aucune API pour ce faire, en utilisant les fonctions de raccourci clavier de l'application.

Je suis assez sûr que cela peut être fait sur Windows, mais Mac?

Merci

Répondre

13

Une façon de le faire est Embedding AppleScript dans votre application Objective-C. Par exemple l'exécution de ce script Apple, envoie Commande + M à System Events application:

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

Vous pouvez intégrer le script ci-dessus dans votre application Cocoa avec quelque chose comme ceci:

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

Parfait. Pour quelqu'un d'autre qui regarde ça, les docs apple sur applescript ont l'air utiles. http://developer.apple.com/library/mac/#documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html. Merci beaucoup – Adam

15

Vous peut le faire sans avoir besoin d'AppleScript aussi. Voici un exemple de code de travail qui envoie un code clé avec des modificateurs.

-Edit: cela ne vous laissera pas cibler une application spécifique, seules les frappes de poste à l'ensemble du système (comme si pressé sur un clavier)

#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

Bonne idée mais comment l'OP envoie-t-il ceci à un processus cible séparé? – BigBrother

+0

Pourquoi cela ne fonctionne-t-il pas avec NX_KEYTYPE_PLAY? Il imprime juste "y" – jLynx