2012-02-09 53 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)。

要記住另一個重要的事情是消除自己作爲一個觀察者-dealloc(或其他地方),讓NSWorkspace不會嘗試通知你的控制器對象,它已經發布後+ dealloc'd(並且將不再有效)。

在指定的-appDidActivate:方法中,根據所需的應用程序信息做任何你需要的操作。

相關問題