JXA通过System Events设置进程窗口bounds报错-10006如何解决
报错原因
你通过System Events获取到的是UI进程代理对象,它暴露的窗口bounds属于UI元素属性,默认仅支持读取,要修改窗口边界必须操作对应应用本身的JXA实例对象,这就是-10006错误的本质原因。
解决方案
你动态匹配到目标进程后,通过进程的pid或者bundle ID动态实例化对应应用的脚本对象,再操作该对象的窗口属性即可,示例代码如下:
// 引入System Events const systemEvents = Application('System Events'); // 这里替换为你自己的动态匹配进程逻辑,可按窗口标题、进程名、pid等任意条件匹配 const matchedProcess = systemEvents.processes.whose({ // 示例条件:匹配窗口标题包含"某关键词"的进程,按需修改 windows: { name: { _contains: "目标窗口关键词" } } })[0]; // 用匹配到的进程pid精准实例化对应的应用对象,多开同bundle应用的场景也不会出错 const targetApp = Application.byId(matchedProcess.unixId()); // 设置第一个窗口的bounds,格式为[左, 上, 右, 下] targetApp.windows[0].bounds = [100, 50, 1000, 700];
注意事项
- 执行脚本的主体(终端、自动化工具等)需要提前在「系统设置→隐私与安全性→辅助功能」中开启权限,否则会触发权限类报错
- 如果需要匹配多窗口,可遍历
targetApp.windows和matchedProcess.windows的id属性做对应,保证操作的是目标窗口
内容的提问来源于stack exchange,提问作者Tyler Liu
相关产品推荐
相关产品推荐

