2011-01-16 16 views
8

Czy jedno okno na pulpicie komputera Mac może programowo przesłać skrót klawiaturowy lub sekwencję klawiszy do innego?Wysyłanie skrótu klawiaturowego do okna Mac OS X

Szukam sterowania aplikacją, która nie oferuje żadnego interfejsu API, za pomocą funkcji skrótu klawiaturowego aplikacji.

Jestem prawie pewien, że można to zrobić w systemie Windows, ale Mac?

Dzięki

Odpowiedz

13

Jednym ze sposobów, aby to zrobić jest osadzanie Applescript w aplikacji Objective-C. Na przykład wykonującego tę APPLESCRIPT wysyła poleceń + M do System Events aplikacja:

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

Można osadzić skrypt powyżej w aplikacji kakao z mniej więcej tak:

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

Perfect. Dla każdego, kto się na to patrzy, przydatne są docs jabłek na applecript. http://developer.apple.com/library/mac/#documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html. Bardzo dziękuję – Adam

15

You można to zrobić bez potrzeby używania AppleScript. Oto przykład działającego kodu, który wysyła klucz z modyfikatorami.

-Edycja: to nie pozwoli Ci ukierunkowana na konkretną aplikację, tylko naciśnięcia klawiszy Posta do całego systemu (jakby wciśnięty na klawiaturze)

#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

Niezły pomysł, ale w jaki sposób PO wysyła to do oddzielnego procesu docelowego? – BigBrother

+0

Dlaczego to nie działa z NX_KEYTYPE_PLAY? Po prostu drukuje "y" – jLynx