为什么 AppleScript 遍历窗口时无法识别全屏模式窗口?
AppleScript 遍历进程窗口时无法识别 macOS 原生全屏窗口的原因
这是macOS系统的窗口层级设计导致的,并非脚本逻辑存在语法错误:
- 从OS X Lion版本开始,点击窗口左上角绿色按钮触发的原生全屏模式,会把对应窗口迁移到独立的系统工作区(Space),这类窗口的辅助功能(AX)层级归属和当前常规桌面的普通窗口是完全分离的
- 原脚本中使用的
windows of proc枚举接口,默认只返回当前活跃桌面空间下、归属于普通窗口层级的元素。当Finder窗口被切换到原生全屏模式后,系统会把它从常规窗口集合中移除,归到独立全屏空间的专属元素列表里,因此原脚本的遍历逻辑会直接漏掉这类窗口——哪怕当前已经切到这个全屏空间,不少macOS版本的System Events也会因为系统给窗口打的专属全屏标记,把它排除在普通windows属性的返回结果之外。
修复方案
想要同时识别普通窗口和独立空间下的全屏窗口,不能只依赖默认的windows枚举结果,需要主动遍历进程下的所有UI元素,把带全屏标记的窗口也纳入统计:
- 先通过常规接口获取非全屏的普通窗口集合
- 递归遍历进程挂载的所有辅助功能元素,筛选出满足两个条件的窗口:属于标准窗口类型、辅助功能属性
AXFullScreen值为真,这部分就是被迁移到独立全屏空间的窗口 - 合并两个窗口集合后再执行遍历逻辑,就不会出现漏检
改进后的可运行脚本示例:
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
相关产品推荐
相关产品推荐

