2011-01-16 14 views
8

Macデスクトップ上の1つのウィンドウで、キーボードショートカットやキーシーケンスを別のウィンドウにプログラムで送信することはできますか?キーボードショートカットをMac OS Xウィンドウに送信

私は、アプリケーションのキーボードショートカット機能を使用して、APIを提供しないアプリケーションを制御しようとしています。

これはWindowsでもMacでも可能ですか?

ありがとう

答えて

13

これを行う方法の1つは、Objective-CアプリケーションにApplescriptを埋め込むことです。このリンゴのスクリプトを実行する例えば 、System Eventsアプリケーションに + Mコマンドを送信します:あなたはこのような何かを使用してCocoaアプリケーションで上記のスクリプトを埋め込むことができます

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

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

パーフェクト。これを見ている他の人のために、リンゴのドキュメントは、AppleScriptで役に立つと思われます。 http://developer.apple.com/library/mac/#documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html。ありがとうございました – Adam

15

あなたはAppleScriptを必要とせずにこれを行うこともできます。修飾子付きのキーコードを送信するコードの例を次に示します。

-edit:これはあなたが特定のアプリを対象とさせません、システム全体への唯一のポストのキーストローク(キーボードで押されたかのように)

#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

いいアイデアですが、OPはこれを別のターゲットプロセスにどのように送信しますか? – BigBrother

+0

これはNX_KEYTYPE_PLAYで動作しないのはなぜですか?それはちょうど "y" – jLynx