如何使用macOS辅助功能API实现应用窗口屏幕布局?
使用macOS Accessibility API调整应用窗口位置与尺寸
前提条件
- 你的App必须请求辅助功能权限:用户需要在「系统设置 > 隐私与安全性 > 辅助功能」中勾选你的App,否则Accessibility API无法工作。
- 上架App Store时,需在Info.plist中添加
NSAccessibilityUsageDescription,说明使用辅助功能的目的(比如"调整应用窗口位置与尺寸,优化桌面布局效率"),否则审核会被拒。
核心实现步骤
- 通过应用名称获取对应进程ID(PID)
- 创建应用对应的AXUIElement实例
- 获取应用的主窗口AXUIElement
- 设置窗口的
AXPositionAttribute(位置)和AXSizeAttribute(尺寸)属性 - 可选:将应用激活至前台
Swift示例代码
以下代码实现与你提供的AppleScript完全相同的功能:将Google Chrome的主窗口调整到左上角,尺寸为1920/3 × 996/2。
import Foundation import ApplicationServices // 辅助函数:通过应用名称获取进程ID func getPID(forAppName appName: String) -> pid_t? { let processInfo = NSProcessInfo.processInfo() for process in processInfo.processes { if process.processName == appName { return process.processIdentifier } } return nil } // 调整窗口位置与尺寸的核心函数 func adjustWindow(forAppName appName: String, position: CGPoint, size: CGSize) { guard let pid = getPID(forAppName: appName) else { print("未找到应用 \(appName)") return } // 创建应用的AXUIElement实例 let appElement = AXUIElementCreateApplication(pid) // 获取应用主窗口 var windowElement: AnyObject? let windowStatus = AXUIElementCopyAttributeValue(appElement, kAXMainWindowAttribute as CFString, &windowElement) guard windowStatus == .success, let window = windowElement as? AXUIElement else { print("获取主窗口失败:错误码 \(windowStatus.rawValue)") return } // 设置窗口位置 let positionValue = AXValueCreate(.cgPoint, &position)! let posSetStatus = AXUIElementSetAttributeValue(window, kAXPositionAttribute as CFString, positionValue) if posSetStatus != .success { print("设置位置失败:错误码 \(posSetStatus.rawValue)") } // 设置窗口尺寸 let sizeValue = AXValueCreate(.cgSize, &size)! let sizeSetStatus = AXUIElementSetAttributeValue(window, kAXSizeAttribute as CFString, sizeValue) if sizeSetStatus != .success { print("设置尺寸失败:错误码 \(sizeSetStatus.rawValue)") } // 激活应用至前台 let activateStatus = AXUIElementSetAttributeValue(appElement, kAXFrontmostAttribute as CFString, kCFBooleanTrue) if activateStatus != .success { print("激活应用失败:错误码 \(activateStatus.rawValue)") } } // 调用示例:对应原AppleScript的逻辑 let targetSize = CGSize(width: 1920/3, height: 996/2) let targetPosition = CGPoint(x: 0, y: 0) adjustWindow(forAppName: "Google Chrome", position: targetPosition, size: targetSize)
关键注意事项
- 沙盒兼容性:开启App沙盒后,Accessibility API仍可正常工作,无需关闭沙盒,这是它比AppleScript更适合上架的核心原因。
- 错误处理:示例中的错误打印仅作演示,实际开发中建议根据
AXError枚举值做针对性处理(比如权限不足时引导用户前往设置开启权限)。 - 多窗口场景:若应用存在多个窗口,可通过
kAXWindowsAttribute获取所有窗口数组,再筛选目标窗口进行操作。
内容的提问来源于stack exchange,提问作者user4150758
相关产品推荐
相关产品推荐

