【问题标题】:Close App A when App B closes: Mac OS X 10.7.3App B 关闭时关闭 App A:Mac OS X 10.7.3
【发布时间】:2012-03-15 17:20:00
【问题描述】:

假设我有两个应用程序正在运行;应用程序 A 和应用程序 B。当应用程序 A 关闭时,让应用程序 B 自动关闭的最简单方法(或者确实存在)是什么?请注意,这些应用都不是我开发的,因此我无法控制它们的内部行为。

我愿意接受任何建议,包括那些需要使用 Applescript、Automator、终端命令和 BASH 脚本的建议。我什至会考虑开发一个轻量级的 Mac OS X 应用程序来实现这一点。

【问题讨论】:

    标签: macos terminal applescript


    【解决方案1】:

    如果您不需要 B 立即退出 - 如果可以等待几秒钟 - 那么您可以安排一个定期后台任务(使用 cron 甚至只使用 iCal),它执行以下操作:

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

    如果您想要立即响应,另一种选择是将应用程序 A 包装在启动它的脚本中,等待它终止,然后终止 B (osascript -e "tell application B to quit")。然后你就可以一直使用那个脚本来启动 A。

    您甚至可以将脚本插入应用程序包中,以便双击运行您的脚本。为此,您可以在应用程序上执行“显示包内容”,将<app>\Contents\info.plist 中的 替换为您的脚本名称,然后将该脚本放入<app>\Contents\MacOS。然后让脚本运行已经存在的可执行文件。

    【讨论】:

    • 当您说“将应用程序 A 包装在启动它的脚本中,等待它终止”时,有没有办法做到这一点,而无需不断轮询应用程序 A 以查看它是否仍然是活动进程?
    • 是的,我只是想让你的脚本调用./A,然后让下一行(在应用程序返回后)成为杀死 B 的行。
    【解决方案2】:

    好问题。我花了大约 10 分钟寻找一个旧项目,我在该项目中注册了应用程序退出时的通知,但无法轻松找到我的代码。但我确实为你找到了一个潜在的替代方案。

    如果您下载 Apple 的 AppList sample code project,您会看到它正在观察 NSRunningApplications 的列表,并且当应用退出时,它会将该应用从窗口中正在运行的应用列表中删除。您可以采用他们在那里使用的技术,当您检测到“应用程序 A”退出时,您可以向“应用程序 B”发送“退出”Apple 事件。

    【讨论】:

    • 好建议!这让我写了一个在 App A 上使用观察者的小应用程序。当在 A 上观察到终止/退出事件时,我们搜索然后关闭 B。[NSRunningApplication runningApplicationsWithBundleIdentifier:@"com.AppB"]; 是代码的关键位。使用观察意味着我们不需要不断地轮询 App A 来查看它是否已关闭。
    【解决方案3】:

    由于您正在运行 Lion,您可以使用 Cocoa-AppleScript 访问 Cocoa 方法以将您的应用程序添加为观察者,并在应用程序退出时收到通知。

    例如,从 AppleScript Editor > File > New from Template > Cocoa-AppleScript applet 创建一个新应用程序。在运行处理程序中,将应用程序添加为观察者,以便在应用程序退出时获取通知:

        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 应用程序不能直接从脚本编辑器运行,因此调试它们可能会有些麻烦,因为没有可查看的事件日志 - 您需要添加自己的对话框或其他内容。

    【讨论】:

    • 我对 Cocoa-AppleScript 一无所知,这就是我直接接受@Michael 建议的原因。但我肯定会在接下来的几天里玩弄它,因为这似乎是一个非常巧妙的解决方案。
    • 顺便说一句,这里发生的是使用 AppleScript/Objective-C (ASOC) 编写脚本,这是 AppleScript 和 Objective-C 运行时之间的桥梁。它使您能够使用 AppleScript 中的 Cocoa,并在 AppleScript 中创建 Objective-C 可以向其发送消息的对象。例如,Cocoa-AppleScript Applet 模板有一个用 AppleScript 编写的 NSApplication 委托。
    • 使用这个答案,我创建了一个 AppleScript 要点来执行此操作,请参阅:gist.github.com/rvlasveld/5429191
    猜你喜欢
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 2017-05-08
    • 2017-10-12
    相关资源
    最近更新 更多