2012-02-25 249 views
4

假設我有兩個應用程序正在運行;應用程序A和應用程序B.當應用程序A關閉時,最簡單的方法是什麼(或實際上是否有)讓應用程序B自動關閉?請注意,這兩個應用程序都不是我自己開發的,所以我無法控制它們的內部行爲。當應用程序B關閉時關閉應用程序A:Mac OS X 10.7.3

我接受任何建議,包括那些需要使用Applescript,Automator,Terminal命令和BASH腳本的建議。我甚至會考慮開發一個輕量級的Mac OS X應用程序來實現這一點。

回答

4

奇妙的問題。我花了大約10分鐘時間尋找一箇舊項目,我註冊了應用程序退出時的通知,但無法輕鬆找到我的代碼。但我確實爲你找到了一個潛在的選擇。

如果您下載Apple的AppList sample code project,您會看到它正在觀察NSRunningApplications的列表,當應用程序退出時,它會從窗口中正在運行的應用程序列表中刪除該應用程序。你可以採用他們在那裏使用的技術,當你發現你的「應用程序A」退出時,你可以發送一個「退出」蘋果事件給「應用程序B」。

+0

好的建議!這讓我寫下了一個使用AppA上的觀察者的小應用程序的路徑。當在A上觀察到終止/退出事件時,我們搜索並關閉B. [[NSRunningApplication runningApplicationsWithBundleIdentifier:@「com.AppB」]] ;'是代碼的關鍵位。使用觀察意味着我們不需要持續輪詢應用程序A以查看它是否已關閉。 – Barjavel 2012-02-26 02:23:42

5

如果您不需要B到立即退出 - 如果它是確定以等待幾秒鐘 - 那麼你可以安排一個週期性後臺任務(使用cron或甚至只是iCal)中,做這樣的事情:

if not exists (processes where name is A) 
    tell application B to quit 
end if 

如果您想要立即響應,另一個選擇是將App A打包到啓動它的腳本中,等待它終止,然後終止B(osascript -e "tell application B to quit")。然後,您可以始終使用該腳本啓動A.

您甚至可以將腳本插入到應用程序捆綁包中,以便雙擊運行腳本。您可以通過在應用程序上執行「顯示包內容」來完成此操作,用您的腳本名稱替換<中的CFBundleExecutable > <app>\Contents\info.plist,然後將該腳本放入<app>\Contents\MacOS。然後讓腳本運行已經存在的可執行文件。

+0

當你說「在啓動它的腳本中打包應用程序A,等待它終止」有沒有辦法做到這一點,而不必繼續輪詢應用程序A,看看它是否仍然是一個活動的過程? – Barjavel 2012-02-26 02:35:06

+0

是的,我只是想讓你的腳本調用'。/ A',然後讓下一行(在應用程序返回後)成爲殺死B的行。 – 2012-02-26 02:56:22

3

由於您運行的是Lion,因此您可以使用Cocoa-AppleScript來訪問Cocoa方法以添加您的應用程序作爲觀察者,從而在應用程序退出時獲取通知。

例如,從AppleScript編輯器>文件>模板新建> Cocoa-AppleScript小程序中創建一個新應用程序。在運行處理程序,添加應用程序作爲觀察員獲得通知,當一個應用程序退出:

set theNotice to current application's NSWorkspaceDidTerminateApplicationNotification 
    tell current application's NSWorkspace's sharedWorkspace's notificationCenter 
     addObserver_selector_name_object_(me, "appQuitNotification:", theNotice, missing value) 
    end tell 

接下來,添加一個appQuitNotification處理器(這是上述addObserver_selector_name_object_指定的處理程序選擇器),像:

on appQuitNotification_(aNotification) -- an application quit 
    -- aNotification's userInfo record contains an NSRunningApplication instance that we can get properties from 
    set theApplication to (aNotification's userInfo's NSWorkspaceApplicationKey's localizedName()) as text 
    say "application " & theApplication & " quit" -- for testing 
    if theApplication is "this" then tell application "that" to quit -- or whatever 
end appQuitNotification_ 

...你完成了。只要您的應用程序正在運行,它將在應用程序退出時從系統收到通知。請注意,這些Cocoa-AppleScript應用程序不能直接從腳本編輯器運行,因此它們可能會有點麻煩,因爲沒有事件日誌可供查看 - 您需要添加自己的對話框或其他內容。

+0

我對** Cocoa-AppleScript **一無所知,這就是爲什麼我直奔@邁克爾的建議。但是我肯定會在接下來的幾天裏玩弄它,因爲這看起來可能是一個很好的解決方案。 – Barjavel 2012-02-26 02:27:59

+0

順便說一下,這裏發生的是使用AppleScript/Objective-C(ASOC)編寫腳本,它是AppleScript和Objective-C運行時間之間的橋樑。它使您可以使用AppleScript中的Cocoa,並在Objective-C可以發送消息的AppleScript中創建對象。例如,Cocoa-AppleScript Applet模板具有用AppleScript編寫的NSApplication委託。 – 2012-02-26 12:11:43

+0

使用此答案我已經創建了一個AppleScript要點來執行此操作,請參閱:https://gist.github.com/rvlasveld/5429191。 – Roemer 2013-04-21 11:22:34