You need to enable JavaScript to run this app. 为什么 AppleScript 遍历窗口时无法识别全屏模式窗口?
优惠活动
大模型
产品
解决方案
定价
更多

为什么 AppleScript 遍历窗口时无法识别全屏模式窗口?

AppleScript 遍历进程窗口时无法识别 macOS 原生全屏窗口的原因

这是macOS系统的窗口层级设计导致的,并非脚本逻辑存在语法错误:

  • 从OS X Lion版本开始,点击窗口左上角绿色按钮触发的原生全屏模式,会把对应窗口迁移到独立的系统工作区(Space),这类窗口的辅助功能(AX)层级归属和当前常规桌面的普通窗口是完全分离的
  • 原脚本中使用的windows of proc枚举接口,默认只返回当前活跃桌面空间下、归属于普通窗口层级的元素。当Finder窗口被切换到原生全屏模式后,系统会把它从常规窗口集合中移除,归到独立全屏空间的专属元素列表里,因此原脚本的遍历逻辑会直接漏掉这类窗口——哪怕当前已经切到这个全屏空间,不少macOS版本的System Events也会因为系统给窗口打的专属全屏标记,把它排除在普通windows属性的返回结果之外。

修复方案

想要同时识别普通窗口和独立空间下的全屏窗口,不能只依赖默认的windows枚举结果,需要主动遍历进程下的所有UI元素,把带全屏标记的窗口也纳入统计:

  1. 先通过常规接口获取非全屏的普通窗口集合
  2. 递归遍历进程挂载的所有辅助功能元素,筛选出满足两个条件的窗口:属于标准窗口类型、辅助功能属性AXFullScreen值为真,这部分就是被迁移到独立全屏空间的窗口
  3. 合并两个窗口集合后再执行遍历逻辑,就不会出现漏检

改进后的可运行脚本示例:

tell application "System Events"
    set targetProc to first process whose name is "Finder"
    -- 获取常规非全屏窗口
    set normalWindows to windows of targetProc
    -- 递归查找所有被移到独立全屏空间的标准窗口
    set fullScreenWindows to entire contents of targetProc where description is "standard window" and value of attribute "AXFullScreen" is true
    -- 合并集合后遍历
    repeat with win in (normalWindows & fullScreenWindows)
        say "I found at least one window"
    end repeat
end tell

注意事项

  • 所有用到辅助功能接口的脚本,必须给运行脚本的程序(如Script Editor、终端)开启「系统设置-隐私与安全性-辅助功能」权限,否则会因为权限限制读不到窗口的全屏属性,甚至触发权限报错
  • 注意区分两种“占满屏幕”的场景:手动拖动窗口到屏幕边缘、没有创建独立工作区的最大化窗口属于普通窗口,本身就会被windows接口正常识别,不存在漏检问题;只有触发独立Space创建的原生全屏窗口,才会出现原脚本识别不到的情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 23:54:07