当应用程序B关闭时关闭应用程序A:Mac OS X 10.7.3

4
我有两个应用正在运行:应用A和应用B。是否有一种最简单的方式(或者确实有一种方式)可以在应用A关闭时自动关闭应用B?请注意,我对这两个应用程序都没有开发权限,因此无法控制它们的内部行为。
我可以接受任何建议,包括使用AppleScript、Automator、终端命令和BASH脚本。我甚至会考虑开发一个轻量级的Mac OS X应用程序来实现这一点。
3个回答

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。
甚至可以将脚本插入应用程序包中,以便双击运行您的脚本。您可以通过在应用程序上执行“显示包内容”,替换<app>\Contents\info.plist中的<CFBundleExecutable>为您的脚本名称,并将该脚本放入<app>\Contents\MacOS中来完成此操作。然后,让脚本只运行已经存在的可执行文件即可。

当你说“将应用程序A包装在一个脚本中,启动它并等待其终止”时,是否有一种方法可以在不必不断轮询应用程序A以查看它是否仍然是活动进程的情况下完成这个过程? - Barjavel
是的,我只是想让你的脚本调用 ./A,然后在应用程序返回后的下一行是杀死 B 的那一行。 - Russell Zahniser

4
很好的问题。我花了约10分钟查找一个旧项目,在该项目中我已经注册了应用程序退出时的通知,但是很难找到我的代码。但我为您找到了一个潜在的替代方案。
如果您下载苹果公司的AppList示例代码项目,则会发现它正在观察运行的NSRunningApplications列表,当应用程序退出时,它将从窗口中的正在运行的应用程序列表中删除该应用程序。您可以采用他们在这里使用的技术,在检测到“应用程序A”退出时,向“应用程序B”发送“退出”苹果事件。

太好了!这启发我编写了一个小应用程序,它在App A上使用观察器。当A上观察到终止/退出事件时,我们会搜索并关闭B。 [NSRunningApplication runningApplicationsWithBundleIdentifier:@“com.AppB”] 是关键代码。使用观察意味着我们不需要不断轮询App A以查看它是否已关闭。 - Barjavel

3
自从你使用Lion系统以来,你可以用Cocoa-AppleScript来访问Cocoa方法,将你的应用程序添加为观察者,并在其他应用程序退出时接收通知。
例如,从“AppleScript编辑器>文件>从模板新建>Cocoa-AppleScript applet”中创建一个新的应用程序。在run handler中,将该应用程序作为观察者添加,以便在其他应用程序退出时接收通知。
    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 处理程序(这是在上面指定的观察者选择器名称),例如:
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应用程序不能直接从脚本编辑器中运行,因此它们可能有点难以调试,因为没有事件日志可供查看——你需要添加自己的对话框或其他东西。


我对 Cocoa-AppleScript 一无所知,这就是为什么我直接采纳了 @Michael 的建议。但我肯定会在接下来的几天里尝试一下它,因为这似乎是一个非常不错的解决方案。 - Barjavel
顺便问一下,这里正在使用AppleScript/Objective-C(ASOC)编写脚本,它是AppleScript和Objective-C运行时之间的桥梁。它使您能够从AppleScript中使用Cocoa,并在AppleScript中创建对象,以供Objective-C发送消息。例如,Cocoa-AppleScript Applet模板具有使用AppleScript编写的NSApplication代理。 - Chris Page
1
使用这个答案,我创建了一个AppleScript要点来完成这个任务,请参见:https://gist.github.com/rvlasveld/5429191。 - Roemer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接