Autojs遇到多窗口导致控件无法找到的原因及解决代码

前言

最近接了个单子,刚好就遇到了这个问题,也是第一次遇到这种问题,上百度都没有找出个所以然来,所以就去问chatgpt了。
当然,chatgpt也没有给出能直接运行的代码,但是他给我指明了研究的方向:窗口过滤。
于是,没有学过java的我去查找相关资料,然后就修改整理出了解决办法~

问题描述

这是软件的主界面,系统会自动推送单子,以弹出窗口的方式显示抢单的界面


这是弹出的抢单窗口界面,你会发现点击布局后显示的依然是主界面

其实对于控件的采集是很好解决的,在布局生成后可以点击 窗口选择

然后选择下面的弹出式窗口即可

此时就可以获取到控件的识别元素了

但是,问题来了,比如上方的时间控件id是tv_time
在脚本运行的时候无论是使用

id("tv_time").exists()

或者是

id("tv_time").findOne(1000)

返回的都是false
这就是本文要解决的问题,原因就是窗口没有通过过滤器。

解决

设置窗口过滤器。
下面代码是一段将窗口过滤器设置为一个恒定返回 true 的函数,表示所有窗口都符合过滤条件,可以被操作。

auto.setWindowFilter(function (window) {
    return true;
});

上面的代码只需要调用一次,就可以解决多窗口下控件无法找到的问题。

但是如果,因为所有窗口都被过滤,而导致识别速度变慢了。
那可以通过添加条件只过滤我们需要的窗口,下面是以窗口名过滤窗口的例子:
这软件运行起来主要就只需要2个窗口:弹窗界面(抢单界面)、等待接驾界面(抢单成功界面),那么就只需要获取下窗口的title值即可,title值可以通过 窗口选择 查看


第一个参数就是title值,获取到两个窗口的title值分别为 “弹出式窗口” “等待接驾”
那么代码就修改如下:

auto.setWindowFilter(function (window) {
    return ["等待接驾", "弹出式窗口"].indexOf(window.getTitle()) != -1;
});

这样就可以只过滤我们需要的窗口了。
如果有更多的窗口需要过滤,可以直接在数组里面添加成员即可。


作 者:道无涯
来 源:道无涯博客
链 接: https://www.daowuya.love/autojs遇到多窗口导致控件无法找到的原因及解决代码/
版 权 声 明:本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0许可协议。文章版权归作者所有,未经允许请勿转载!


暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇