2012-02-25 186 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