OSX:app拦截“关闭”命令

时间:2013-09-20 00:13:22

标签: macos bash shell applescript

快速背景:新手机,长时间用户;不怕linux和脚本;不是母语为英语的人,所以对我的翻译很好:)

我目前正在使用RedQuits使x红色按钮退出应用程序,而不仅仅是关闭窗口。

这是一个很棒的程序,但是有一个小问题(对我来说):一个人无法选择哪些应用程序应该保持默认行为(x关闭窗口,而不是应用程序)。

所以我找到了一个名为Stoplight的非常古老的(2006)应用程序,它完全符合我的要求:选择哪些程序不应受到影响。

不幸的是,Stoplight不再起作用了。

所以,我试着看看脚本做了什么(它是一个.bundle),但看起来好像已经编译了。

问题:

  • 有没有办法反编译脚本,所以我可以让它再次运作?
  • 如果没有,任何人都知道如何制作不应被RedQuits关闭的应用白名单?
  • 再次,如果没有,我应该在哪里开始构建我自己的脚本来拦截关闭窗口并使其杀死应用程序的信号?
  • 感谢任何其他提示。

感谢。


编辑(2013-09-23)

我找到了解决问题的方法 我创建了一个AppleScript来监视在后台运行的没有窗口的进程 如果该过程不在白名单中,请将其关闭。

我稍后会发布剧本,但说实话,我不喜欢我的解决方案,仍然想知道你们是否有任何想法。

所以我不接受我的回答是正确的。


编辑(2013-09-26)

我们应该将问题迁移到https://apple.stackexchange.com/吗?

2 个答案:

答案 0 :(得分:2)

这可能不是您想要听到的,但您可以使用CMD-Q键盘快捷键执行此操作。

但是,如果您需要过滤哪种应用程序适用于您,可以使用键盘快捷方式:

  • Automator应用程序中的新服务
  • 添加“运行Applescript”操作
  • 设置服务参数:

服务在no input

中收到any application
  • 添加以下Applescript:

on run {input, parameters}
    tell application (path to frontmost application as text) to quit
    return input
end run
  • 使用新名称保存服务,例如退出并关闭自动播放器应用
  • 打开“系统偏好设置”对话框的“键盘”部分
  • 选择“键盘快捷键”标签
  • 从左侧选择“服务”
  • 向下滚动右侧以查找“QuitAll”服务
  • 启用并单击“QuitAll”服务的右侧
  • 添加键盘快捷键。我选择了CTRL-CMD-Q,但您可以选择
  • 关闭“键盘”偏好设置对话框

现在这是非常简单的 - 它 应该所有应用程序,没有例外,就像CMD-Q一样。您应该能够编辑applescript以在此处添加某种应用过滤。

答案 1 :(得分:0)

这是我的解决方法。我对它不满意,因为它每10秒循环一次“退出”过程 将它发布在这里以防万一它可以帮助任何人...

#!/usr/bin/osascript

-- INICIO DAS FUNCOES EXTRAS
set app_path to path to current application
set app_name to get name of me
set myPath to path to me
tell application "Finder" to set myFolder to (container of myPath) as string
set commonScript to load script alias ((myFolder) & "FuncoesExtras.scpt")
-- FIM DAS FUNCOES EXTRAS

set WhiteList to {app_name, "App Store", "iTunes", "Finder", "Mail"}

repeat

    tell application "System Events"
        repeat with this_app in (get processes whose background only is false and windows is {})
            set NomeDoApp to the name of this_app
            if NomeDoApp is not in WhiteList then
                try
                    tell NomeDoApp to quit
                    log_event("App " & NomeDoApp & " encerrado com sucesso", "FecharProgramas") of commonScript
                on error
                    do shell script "killall " & quoted form of NomeDoApp
                    log_event("Forcando interrupcao do App " & NomeDoApp, "FecharProgramas") of commonScript
                end try
            end if
        end repeat
    end tell

    tell application "System Events" to set myPID to (unix id of processes whose name is app_name)
    do shell script ("/usr/bin/renice 18 " & myPID)

    delay 10

end repeat

我仍然愿意接受建议。