【Auto.js】使用Pro 8.0 API优化图色或无障碍的耗电问题

举报
红目香薰 发表于 2022/01/21 22:11:13 2022/01/21
【摘要】 由于Auto.js目前的API都是同步的,要在屏幕中搜索某张图色或者某个控件时,必须无限循环查找,这实际上非常耗电。由于Rhino的限制,Auto.js无法直接提供异步API,这让Auto.js的脚本天生有一些缺陷。 为了解决这些问题,Auto.js Pro 8.0.0-3引入了两个新的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()函数来获取截图,并无限循环地寻找目标图片,比如:


  
  1. // 请求截图权限
  2. requestScreenCapture();
  3. // 读取目标图片
  4. let target = $images.read("./test.png");
  5. while (true) {
  6. // 获取屏幕截图
  7. let capture = $images.captureScreen();
  8. // 找图
  9. let pos = $images.findImage(capture, target);
  10. // 打印
  11. console.log(pos);
  12. }

而使用async参数后,我们可以在"screen_capture"事件中获取到图片,例如:


  
  1. // 请求截图权限, 注意参数 async: true
  2. requestScreenCapture({async: true});
  3. // 监听屏幕截图
  4. $images.on("screen_capture", capture => {
  5. // 找图
  6. let pos = $images.findImage(capture, target);
  7. // 打印
  8. console.log(pos);
  9. });

使用这样的方式,我们可以只在屏幕刷新时通过事件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的打开,可以用以下代码监听:


  
  1. // 监听窗口变化
  2. auto.registerEvent('windows_changed', e => {
  3. // 判断是否有新窗口打开
  4. if (e.windowChanges.indexOf('add') >= 0) {
  5. // 获取新窗口的id
  6. let wid = e.windowId;
  7. // 遍历窗口,获取新窗口
  8. let window = auto.windows.filter(w => w.id == wid);
  9. // 判断新窗口是Auto.js
  10. if (window.length >= 0 && window[0].title == 'Auto.js') {
  11. toast("Auto.js被打开了!");
  12. }
  13. }
  14. });

 

文章来源: laoshifu.blog.csdn.net,作者:红目香薰,版权归原作者所有,如需转载,请联系作者。

原文链接:laoshifu.blog.csdn.net/article/details/115313705

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200