2012-02-09 9 views
3

現在のアプリケーションに応じて動作をトリガーするOS Xのアプリケーションを書き込もうとしています。それと対話する必要はありません。それが変わったときと何に変わったのかを知る必要があります。OS Xでは、現在アクティブなアプリケーションが変更されたときをどのように検出できますか?

誰でもこのために利用できるAPIをお勧めしますか?私の推測では、ほとんどのアプリケーションがBetterTouchToolなどのような、現在のアプリケーションとやりとりする必要があるので、補助サービスの中に何かがあるでしょう。しかし、これらのアプリケーションは、それらのウィンドウを直接操作するのに対して、私は読み取り専用のアクセスしか必要としないので、私は確信していません。

類似のものへのガイダンスや参照リンクは非常に高く評価されます。

(私が試した何が「アクティブアプリケーションのなかったタグについては申し訳ありませんPS。「現在のアプリケーション」、「集中アプリケーションのすべての空白を描きました。)

答えて

7

アプリになるときは、通知を受けるためにNSWorkspaceを使用することができますアクティブ(NSWorkspaceDidActivateApplicationNotification)、またはアクティブな状態を終了(NSWorkspaceDidDeactivateApplicationNotification)します。詳細は、NSWorkspaceのドキュメントを参照してください。あなたのコントローラクラスで

は、あなたがこのような何かをしたい:

- (id)init { 
    if ((self = [super init])) { 
     [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self 
          selector:@selector(appDidActivate:) 
          name:NSWorkspaceDidActivateApplicationNotification 
           object:nil]; 
    } 
    return self; 
} 

- (void)dealloc { 
    [[[NSWorkspace sharedWorkspace] notificationCenter] removeObserver:self]; 
    [super dealloc]; 
} 

- (void)appDidActivate:(NSNotification *)notification { 
    NSDictionary *userInfo = [notification userInfo]; 
    NSLog(@"userInfo == %@", userInfo); 

} 

のキーポイントは-initに示すように、あなたが通知を受け取るように登録する必要があることを基本的にあります。追加の通知名ごとに別のオブザーバーを追加するコードを繰り返します(例:NSWorkspaceDidDeactivateApplicationNotification)。それがリリースされています後

覚えておくべきもう一つの重要なことは、あなたのコントローラオブジェクトを通知しようとしないNSWorkspaceように、(他の場所または)-deallocにオブザーバーとして自分自身を削除することです+ dealloc'd(そして、もはや有効ではないだろう)。

指定された-appDidActivate:の方法では、問題のアプリについての情報を必要なものにしてください。

関連する問題