按键精灵

最近在使用按键精灵来模拟按键。记录一下过程。重点推荐从图层中找。这样效率高,而且准确度也高。

语法基础

其语法是mq,感觉是一种介于vbscript跟其他语言的混合语言。手机版中,还集成了Lua。所以,能使用的语法,有2种。下面主要讲vb

If Len(iId)<> 0 Then 
	TracePrint "真"
Else 
	TracePrint "假"
End If

isNull

图层查找

Element.find

用类名、文字查找对应的元素的。

要求两个参数缺一不可。而且,对图片类的,虽然有文字,但是也不好找。

Dim Table = element.Find("android.view.View","领100MB")
Dim iId = Table[1]["resource-id"]			//没数据为空 
Dim strClass = Table[1]["class"]    //没数据为空 ""
Dim strText = Table[1]["text"]   //没数据为空 ""
Dim iLeft = Table[1]["left"]   //没数据为 -1
Dim iTop = Table[1]["top"]      //没数据为 -1
Dim iRight = Table[1]["right"]    //没数据为 -1
Dim iBottom = Table[1]["bottom"]    //没数据为 -1

' 上面如果找到,应该是很多的坐标值


TracePrint Encode.TableToJson(Table)

Dim i= 13
TracePrint UBound(Table)  '好奇怪  Table可能是lua里面的东西。所以,使用了方括号,来查找。
' 跟vb里面的语法相差有点大。  Table[1] 第一个元素。最大的索引  UBound(Table) + 1


TracePrint Table[i]["left"]
TracePrint Table[i]["top"]
TracePrint Table[i]["right"]
TracePrint Table[i]["bottom"]

' TracePrint Table(i)["left"]

对于屏幕上无法显示的图案,也能查找处理,但是坐标值,有点奇怪。比如宽、高可能很小。

其他的几个功能函数,也很强大。但是,我还没有想到用他们的方法。element.Find可能是一种是同类的方法中的封装方法。

Element.GetAllInJson

获取界面所有元素。相当于导出整个图层。注意,一般图层类似与[元素1,元素2]。其中元素2是我们想要的内容。这是因为,元素1,是指最顶部的时间格式。

反序列化,可能很费时

Dim layout, layoutTable, allText
layout = Element.GetAllInJson()
TracePrint layout
layoutTable = Encode.JsonToTable(layout)
//传入一个主要内容层的数据
allText = Element.GetText(layoutTable[Len(layoutTable)]) '第2个才是目标元素
For each text in allText
    TracePrint text
Next

Element.GetAll

获取界面元素。上面的json数据,其实是嵌套的。使用该方法,则直接变成一维数组了。所以,element.Find正是利用了该元素的功能。

可见元素,对于容器,可能已经被过滤掉了。

Dim Table, iId, sClass, sText
Dim iLeft, iTop, iRight, iBottom
Table = Element.GetAll() 
//获取第一个元素属性内容
For Each one In Table
	TracePrint one["text"]
Next

Element.GetText

获取元素文本内容 。输入的是json(layout布局)转换后的table。然后聚焦在文本内容。

Encode.JsonToTable(layout)这个是最耗时的过程。

Dim layout, layoutTable, allText
layout = Element.GetAllInJson()
TracePrint layout
layoutTable = Encode.JsonToTable(layout)  //这一步,非常的耗时。
//传入一个主要内容层的数据
allText = Element.GetText(layoutTable[Len(layoutTable)])
For each text in allText
    TracePrint text
Next

找图找色

多点找色

多个点,找几个颜色,好像是:只要找到其中一个颜色,就认为成立了。

除非是很纯的一块色块,一般都不容易找到。然后偏色、相似度相互配合。

另外,如果确定是在某个区域,最好再限制一下区域。

Dim intX,intY
FindMultiColor 0,0,0,0,"61BDFF-111111","13|1|179FFF-111111",0,0.9,intX,intY
If intX > -1 And intY > -1 Then
	TracePrint intX
	TracePrint intY
End If

唉,反正找图找色也有很多的坑。

找图

需要添加到附件中。

制作字体

先在找图找色区域,调整好,提取要找的区域,然后切换到字体上,继续操作。(文档上没有说太清楚)

但是不建议使用。误判高,效率低,而且还要制作字段。

代码架构

对于按键类的操作,由于界面上什么情况都可能出现,为了使脚本更加的稳健,所以我们应该合理安排代码架构。我看到一篇文章这样设计:设计两个线程,主线程用来跑任务,而另外一个线程,用来跑监控,看屏幕当前是什么情况。

对于按键精灵,指令可以分成两类:耗时、非耗时命令。任何耗时命令,执行完后,再执行下一条命令,当前应用是什么情况,(执行成功了、执行失败了)都是不确定的。所以,我这样设计:

但是下面好像也并不是很理想。

如果有两个任务。这样咋分解?

下面的代码结构,仿佛就是操作系统的线程管理一样。如果需要交叉执行呢?

Sub sub1()
    ' 决策大脑
    status = '应该是全局的操作
    sleep_time  '设计一下需要延迟的时间。
    Do
    Select Case status:
    Case 0,1    '可支持判断多个值,中间以逗号隔开
        TracePrint "执行进入主页,并延迟10秒"
	Case 2
	    TracePrint "执行进入签到页,并延迟10秒"
	Case Else
        TracePrint "我也不知道要做啥,就先延迟100秒吧。"
        ' 判断是否还需要延迟。
        Delay 100
	End Select
    Loop
End Sub


Sub sub2()
    ' 决策大脑
    status = '应该是全局的操作
    sleep_time  '设计一下需要延迟的时间。
    ......
End Sub