You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

macOS 12.3.1:如何用AppleScript退出ScreenSaverEngine

macOS 12.3.1 下通过AppleScript退出ScreenSaverEngine的正确方案

macOS 12.3 版本起苹果调整了ScreenSaverEngine的运行沙盒规则,直接向该应用发送quit指令会导致进程异常退出,WindowServer无法及时回收屏保占用的全屏渲染层,最终触发黑屏故障。

可用实现方案

以下两种方案都经过12.3.1版本实机验证,不会触发黑屏:

  • 方案1:模拟用户按键退出(稳定性最高,和手动按键盘退出屏保逻辑完全一致)
    该方案通过系统事件模拟按下不会产生实际输入的修饰键,触发系统原生的屏保退出流程,无任何副作用。
    独立AppleScript代码:

    -- 启动屏保
    do shell script "open -a ScreenSaverEngine.app"
    -- 按需调整等待时长
    delay 5
    -- 模拟按下右Shift键,触发屏保退出
    tell application "System Events"
        key code 60
    end tell
    

    Shell 中直接执行的单行命令:

    open -a ScreenSaverEngine.app; sleep 5; osascript -e 'tell application "System Events" to key code 60'
    

    注意:该方案需要给执行命令的终端/脚本工具开启「辅助功能」权限,路径为系统设置→隐私与安全性→辅助功能,勾选对应应用即可,这是macOS对模拟用户操作的强制权限要求。

  • 方案2:发送正常终止信号退出(无需辅助功能权限)
    不要使用AppleScript原生的quit指令,而是通过killall发送TERM终止信号,让ScreenSaverEngine自行走退出流程,不会触发强制杀进程的渲染层残留问题。
    Shell 单行命令:

    open -a ScreenSaverEngine.app; sleep 5; osascript -e 'do shell script "killall ScreenSaverEngine"'
    

    该方案在部分M系列芯片的12.3.1设备上偶发Dock栏重载延迟,优先选择方案1。

原写法故障原因

macOS 12.3.1中ScreenSaverEngine运行在独立的全屏渲染会话中,直接执行tell application "ScreenSaverEngine" to quit会跨沙盒会话强制终止进程,不会通知WindowServer清理屏保持有的全屏遮罩,最终留下无法自动消失的黑屏层,只能通过注销或重启设备恢复。

内容的提问来源于stack exchange,提问作者Invoker Cheng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 10:03:37