Auto.js Pro 8.0.0-3 新增方法

原文 转自 [官方论坛](https://www.autojs.org/topic/3558/%E4%BD%BF%E7%94%A8pro-8-0-api%E4%BC%98%E5%8C%96%E5%9B%BE%E8%89%B2%E6%88%96%E6%97%A0%E9%9A%9C%E7%A2%8D%E7%9A%84%E8%80%97%E7%94%B5%E9%97%AE%E9%A2%98?tdsourcetag=s_pcqq_aiomsg),本文档修改、整理 # 概述 ## 更新日志(去除优化及修复bug部分) ### Pro 8.0.0-3 1. 引入两个新的API来优化图色模块和控件模块的耗电问题。 (1) requestScreenCapture() 支持async(异步)模式 (2) auto支持监听无障碍事件 这两个API的使用将会在论坛中提供教程。 2. 新增 增加runtime.gc()函数 ## 使用Pro 8.0 API优化图色或无障碍的耗电问题   由于Auto.js目前的API都是同步的,要在屏幕中搜索某张图色或者某个控件时,必须无限循环查找,这实际上非常耗电。由于Rhino的限制,Auto.js无法直接提供异步API,这让Auto.js的脚本天生有一些缺陷。   为了解决这些问题,Auto.js Pro 8.0.0-3引入了两个新的API,来尽量减少图色模块和控件模块使用时的耗电。 # 图色模块的耗电优化 ## requestScreenCapture(options) ● options {Object}   ● `async` {Boolean} 是否以异步事件的形式提供截图   ● `width` {Number} 截图宽度   ● `height` {Number}} 截图高度   ● `orientation` {String} 屏幕方向,"landscape"为横屏,"portrai"为竖屏,"auto"为自动   请求截图权限的参数中,增加了async的参数,这个参数运行我们以异步的方式,来获取屏幕截图。在以前,我们通过captureScreen()函数来获取截图,并无限循环地寻找目标图片,比如: ``` // 请求截图权限 requestScreenCapture(); // 读取目标图片 let target = $images.read("./test.png"); while (true) { // 获取屏幕截图 let capture = $images.captureScreen(); // 找图 let pos = $images.findImage(capture, target); // 打印 console.log(pos); } ``` 而使用async参数后,我们可以在"screen_capture"事件中获取到图片,例如: ``` // 请求截图权限, 注意参数 async: true requestScreenCapture({async: true}); // 监听屏幕截图 $images.on("screen_capture", capture => { // 找图 let pos = $images.findImage(capture, target); // 打印 console.log(pos); }); ```   使用这样的方式,我们可以只在屏幕刷新时通过事件screen_capture唤醒代码,获取到最新的屏幕截图,并寻找目标图片。 实测在普通软件界面的找图中,CPU使用率减少了75%左右。 # 无障碍功能的耗电优化   与找图找色类似,在以前,Auto.js也一直只能通过无限循环去判断当前界面、寻找控件,这实际上对省电优化十分不友好。在Pro 8.0.0-3版本,我们引入了监听无障碍事件的API。 ## auto.registerEvents(events) - `events` {Array} 要监听的事件数组 - 返回 {EventEmitter} ## auto.registerEvent(event, callback) - `event` {String} 要监听的事件 - `callback` {Function} 事件回调 - 返回 {EventEmitter} 以上两个函数用于监听一个或多个无障碍事件。所谓无障碍事件,即(其他软件)窗口发送变化、控件发送变化时的事件,包括: - `view_clicked` 控件被点击 - `view_long_clicked` 控件被长按点击 - `view_selected` 控件被选中 - `view_focused` 控件成为焦点 - `view_text_changed` 控件文本改变 - `view_scrolled` 控件被滑动 - `window_state_changed` 窗口状态变化 - `window_content_changed` 窗口内容变化 - `window_changed` 屏幕上显示窗口的变化(增加,删除,子窗口变化等) - `notification_state_changed` 通知状态变化 例如,我们要监听Auto.js的打开,可以用以下代码监听: ``` // 监听窗口变化 auto.registerEvent('windows_changed', e => { // 判断是否有新窗口打开 if (e.windowChanges.indexOf('add') >= 0) { // 获取新窗口的id let wid = e.windowId; // 遍历窗口,获取新窗口 let window = auto.windows.filter(w => w.id == wid); // 判断新窗口是Auto.js if (window.length >= 0 && window[0].title == 'Auto.js') { toast("Auto.js被打开了!"); } } }); ```