AppleScript 可稳定控制 macOS 应用窗口位置、尺寸和层级,但需配合 System Events 并处理全屏、最小化、多屏等边界状态;应使用 Bundle ID(如 com.apple.Safari)精准定位应用,避免名称本地化问题;操作前须 activate 目标应用并 delay 0.2 确保界面就绪;通过 bounds of first screen 获取主屏可用区域,按比例计算坐标而非硬编码;对 Finder 等多窗口应用,用 first window whose subrole is "AXStandardWindow" 更可靠;须先检测并还原全屏(AXFullScreen)与最小化(AXMinimized)状态;关键操作建议加 timeout 3 防卡死;常用布局应封装为 handler 提升复用性。

AppleScript 能稳定控制 macOS 应用窗口的位置、尺寸和层级,但必须配合 System Events,并处理好边界状态(如全屏、最小化、多屏)才能真正落地。
用 Bundle ID 精准定位应用,避免名称本地化问题
应用名称在不同语言系统下会变化,而 Bundle ID 始终唯一。例如 Safari 是 com.apple.Safari,Finder 是 com.apple.finder。脚本开头应先激活目标应用,再延时等待界面就绪:
- 使用
tell application id "com.apple.Safari" to activate - 加
delay 0.2给系统留出渲染时间,避免后续操作失败 - 接着通过
System Events获取该进程的窗口对象,而非依赖前台应用判断
动态获取屏幕可用区域,适配多显示器
macOS 的 bounds of first screen 返回的是当前主屏的可用像素范围(已排除菜单栏与 Dock),格式为 {x, y, width, height}。若需定位到第二屏,改用 second screen 即可:
- 不建议硬编码坐标,比如
{0, 0, 1280, 720}在高分屏或外接显示器上会错位 - 推荐按比例计算:设主屏宽高为
{w, h},左上四分之一区域就是{0, 0, w/2, h/2} - 对 Finder 等可能含多个窗口的应用,用
first window whose subrole is "AXStandardWindow"更可靠
还原窗口状态后再调整,避开全屏/最小化陷阱
直接设置 position 或 size 对全屏或最小化窗口无效。必须先检测并还原:
- 检查
value of attribute "AXFullScreen",为 true 时执行perform action "AXZoom" - 检查
value of attribute "AXMinimized",为 true 时设为false - 关键操作建议包裹
timeout 3,防止因 App 启动慢导致脚本卡死
封装常用布局为 handler,提升复用性
把四分屏、居中、半屏等逻辑写成可调用函数,便于组合调度。例如定义 placeWindowInQuadrant(appID, "top-right"):
- 函数内统一做激活、还原、取屏参、算坐标、设位置尺寸等步骤
- 传入 Bundle ID 和方位关键词,无需重复写相似逻辑
- 可进一步扩展支持“当前前台窗口”或“指定窗口编号”参数


















