• 按键公众号 :
按键精灵电脑版
立即下载

软件版本:2014.06
软件大小:22.9M
更新时间:2021-12-03

按键精灵安卓版
立即下载

软件版本:3.7.2
软件大小:46.2M
更新时间:2023-05-10

按键精灵iOS版
立即下载

软件版本:1.8.0
软件大小:29.2M
更新时间:2023-03-21

按键手机助手
立即下载

软件版本:3.8.0
软件大小:262M
更新时间:2023-05-30

快捷导航

登录 后使用快捷导航
没有帐号? 注册

发新话题 回复该主题

[教程心得] 按键精灵安卓版:MQ 语言介绍 (命令大全) [复制链接]

1#
本帖最后由 兄弟工程师05 于 2014-8-21 18:03 编辑

按键精灵Android版:MQ 语言介绍(命令大全



MQ是按键精灵针对旗下移动产品而设计的全新脚本开发语言。语言支持全中文阅读脚本,上手简单,易学易用。MQ语言的基本特性如下:


数据类型
在MQ语言里,数据类型包括如下5种:
Null不包含任何有效数据
Boolean仅包含True和False两个常数
Integer32位有符号整数,范围为-2,147,483,648 到 2,147,483,647 之间
Float双精度浮点数,负数范围从 -1.79769313486232E308 到-4.94065645841247E-324,正数范围从 4.94065645841247E-324 到1.79769313486232E308
String字符串


MQ语言为动态类型,即定义变量时并不指定类型,在给变量赋值时才确定类型,并且类型随时可以通过赋值操作而变化。

常量
MQ语言中,用户可直接在脚本内写入没有命名的常量的,具体类型与写法如下:
整数型可直接输出整数数字,如100;亦可加&H前缀,表明该常量为16进制数字,如 &H64。
浮点型可直接输出小数点数字,如3.1415;亦可采用E分隔整数和底数部分,如314.15e-2。
字符串型凡采用一对双引号包含的内容均被视为字符串型常量。其中允许使用转义字符包括有:'\b' (退格), '\f' (表单), '\n' (换行), '\r' (回车), '\t' (横向制表), '\v' (纵向制表), '\\' (反斜杠), '\" '(双引号), 以及 '\' '(单引号)。另外也支持反斜杠加数字来描述一个字符。(注意,如果需要在这种描述方法后接一个是数字的字符,那么反斜杠后必须写满三个数字)
MQ语言中有一下已经预先定义好的常量,目标包括True和False(不区分大小写),今后还会增加。


变量
MQ语言的命名方式如下:

变量名不区分大小写,同时关键字(如If、Dim)与子程序的名字也无须区分大小写。

变量名、关键字及子程序的命名同时支持中文及英文,除了第一个字母外,后续内容还可以用数字。

变量在使用前必须用Dim语句定义,但Dim语句不必指定类型。声明多个变量时,使用逗号分隔变量。例如: Dim Top, Bottom, Left, Right, 上, 下, 左2, 右1。

变量的作用域由声明它的位置决定。如果在子程序中声明变量,则只有该子程序中的代码可以访问或更改变量值,此时变量具有局部作用域并被称为局部变量。如果在子程序之外声明变量,则该变量可以被当前脚本的所有子程序所识别,称为全局变量。

变量还可以定义为数组的形式,数组可以是一维的,也可以是多维的,数组的每个维度的索引都是从0开始的正整数,当定义一维数组时,可以指定数组的初始元素个数,也可以不指定。如:
Dim Array()
Dim Array(10)

上述例子都可以定义一个一维数组。但即使指定了数组的初始元素个数,以后也可以随时增加新的元素(直接访问新的元素即可)。当定义多维数组的时候,则必须指定数组在每个维度的初始元素个数,各个维度的初始元素个数之间用逗号分隔,如:
Dim TwoDemensionArray(2,2)
目前,多维数组暂时不支持增加新的元素,也不支持ReDim语句,待以后再支持。

版本更新内容
从零学起之安卓篇《版本1.3.1命令更新介绍:GetPixelColor\WriteConfig\ReadConfig》
从零学起之安卓篇《多点触屏控制命令介绍:TouchDown\TouchMove\TouchUp》

运算符

变量和常量之间采用运算符连接后,称为表达式。MQ语言支持的运算符包括:


运算符

含义

+

加法运算

-

二元运算符:减法

一元运算符:负号

*

乘法运算

/

除法运算

Mod

整除取余

^

取幂

&

字符串连接

=

赋值

例如:当一个语句为X=Y

等于(当用于表达式内部时)

<>

不等于

>

大于

<

小于

>=

大于等于

<=

小于等于

Not

逻辑非

And

逻辑与

Or

逻辑或


基本语句


MQ的基本语句如下:

注意!以下标红为按键精灵(安卓版)新增的相关命令语句,包含部分有改动的语句


格式

解释

If

If 表达式 Then

ElseIf 表达式 Then

Else

End If

判断表达式并执行语句--通过判断表达式的取值,来执行后面的动作或控制。

Else

If 表达式 Then

ElseIf 表达式 Then

Else

End If

If语句结合,进行条件判断。

ElseIf

If 表达式 Then

ElseIf 表达式 Then

ElseIf 表达式 Then

Else

End If

If语句结合,进行条件判断。

Then

If 表达式 Then

IfElseIf语句结合,进行条件判断。

While

While 循环条件

Wend

循环语句--当循环条件成立的时候,反复执行循环体。

Wend

While 循环条件

Wend

While一起构成循环语句。

For

For 循环次数

For 变量 = 起始数值 To 终止数值

For 变量 = 起始数值 To 终止数值 Step 步长数值

For Each 变量 In 数组

...

Next

循环语句。可以循环一定次数,也可以按照变量的起始数值到终止数值循环(如果不指定步长数值,默认步长为1),也可以循环取得数组中的所有值。

Next

Next

For一起构成循环语句。

Select

Select Case 表达式

Case 情况1

Case 情况2

Case Else

End Select

根据情况选择条件判断。

Case

Select Case 表达式

Case 情况1

Case 情况2

Case Else

End Select

根据情况选择条件判断。

Do

Do While 表达式

Loop

或者

Do Until 表达式

Loop

条件循环

Loop

Do While 表达式

Loop

或者

Do Until 表达式

Loop

条件循环

Until

Do Until 表达式

Loop

条件循环

Sub

Sub 过程名(参数1, 参数2, ...)

End Sub

定义一个过程,可以在脚本中调用这个过程。

Function

Function 函数过程名(参数1, 参数2, ...)

End Function

定义一个函数过程,可以在脚本中调用这个函数。

Call

Call 函数或者过程名

(参数1, 参数2, ...)

可以简写为

函数或者过程名 参数1, 参数2, ...

(省略Call关键字,并且无括号)

调用函数或者过程。

End If

End If

用于配对结束 If 条件判断。

End Select

End Select

用于配对结束 Select Case 选择情况判断。

End Sub

[End Sub

用于配对结束 Sub 子程序过程。

End Function

End Function

用于配对结束 Function 函数过程。




Exit Do

Exit Do

用于配对退出 Do 循环。

Exit For

Exit For

用于配对退出 For 循环。

Exit Sub

Exit Sub

用于配对退出 Sub 子程序过程。

Exit Function

Exit Function

用于配对退出 Function 函数过程。

EndScript

EndScript

强制结束脚本的执行。

Dim

Dim 变量1, 变量2 ...

定义一个或多个变量。


内置命令

MQ语言中已经包含了下列名称的子程序(也称为内置命令),在脚本中可以随时调用。


名称

格式

解释

Abs

Abs(数值表达式)

返回数值的绝对值,绝对值是其无符号的数值大小。例如,Abs(-1) Abs(1) 都返回 1

Asc

Asc(字符串表达式)

返回与字符串的第一个字母对应的字符ASCII码。

Atn

Atn(数值表达式)

返回数值的反正切值。

即计算直角三角形两个边的比值 (number) 并返回对应角的弧度值。此比值是该角对边的长度与邻边长度之比。结果的范围是从 -pi/2 pi/2 弧度。

将角度乘以 pi/180 即可转换为弧度,将弧度乘以 180/pi 即可转换为角度。

CBool

CBool(表达式)

试图把表达式转换为Bool类型并返回此Bool值。

CDbl

CDbl(表达式)

试图把表达式转换为数值类型并返回此数值。

Chr

Chr(数值表达式)

返回与指定的ASCII字符代码相对应的字符。

CInt

CInt(表达式)

试图把表达式转换为数值类型,并返回此数值经过四舍五入的结果。

CLng

CLng(表达式)

试图把表达式转换为数值类型,并返回此数值经过四舍五入的结果。

Sin

Sin(数值表达式)

返回将某个角表示为弧度数值的正弦值。即取某个角并返回直角三角形两边的比值。此比值是直角三角形中该角的对边长度与斜边长度之比。

结果范围在 -1 1 之间。

将角度乘以 pi/180 即可转换为弧度,将弧度乘以 180/pi 即可转换为角度。

Cos

Cos(数值表达式)

返回将某个角表示为弧度数值的余弦值。

即取某个角并返回直角三角形两边的比值。此比值是直角三角形中该角的邻边长度与斜边长度之比。结果范围在 -1 1 之间。

将角度乘以 pi/180 即可转换为弧度,将弧度乘以 180/pi 即可转换为角度。

CSng

CSng(表达式)

试图把表达式转换为数值类型并返回此数值。

CStr

CStr(表达式)

试图把表达式转换为字符串类型并返回此字符串。

Date

Date(时间表达式)

返回当前系统日期。格式为 //日,如2013101日表示为2013/10/01

Exp

Exp(数值表达式)

返回 e(自然对数的底)的幂次方。常数e约为 2.718282

Fix

Fix(数值表达式)

返回指定数值的整数部分。

如果指定的数值为负数时,Fix会返回大于或等于该数值的第一个负整数。例如,Fix -8.4 转换为 -8

Hex

Hex(数值表达式)

返回表示十六进制数值的字符串。当指定的数值表达式包含小数位时,会先采用四舍五入的方式去掉小数位再转换。

InStr

InStr(起始位置, 字符串1, 字符串2)

返回字符串2在字符串1中第一次出现的位置,从字符串1的某个指定起始位置开始搜索。

起始位置为数值表达式,用于设置每次搜索的开始位置,设为0表示从头开始搜索。

InStrRev

InStrRev

(字符串1, 字符串2, 起始位置)

返回字符串2在字符串1中出现的从结尾计起的位置。从字符串1的某个指定起始位置开始逆向搜索。

起始位置为数值表达式,用于设置每次搜索的开始位置,设为-1,表示从最后一个字符的位置开始搜索。

Int

Int(数值表达式)

返回指定数值的整数部分。如果指定的数值为负数时,Int会返回小于或等于该数值的第一个负整数。

IsArray

IsArray(变量)

返回 Bool 值指明某变量是否为数组。如果变量是数组,IsArray 返回 True;否则,返回 False

IsNull

IsNull(变量)

返回 Bool 值,指明某变量是否不包含任何有效数据 (Null)。未初始化的变量通常都不包含任何有效数据。

IsNumeric

IsNumeric(变量)

返回 Bool 值,指明某变量是否为数值类型。如果变量是数值类型,IsNumeric 返回 True;否则,返回 False

Join

Join(字符串数组)

返回一个字符串,此字符串由包含在数组中的多个子字符串联接创建,各个子字符串之间采用分隔符隔开。

分隔符是字符串类型,可以是空字符串 ""

KeepScreen

KeepScreen Bool类型表达式)

当指定的Bool类型表达式为True的时候,保持屏幕常开状态;否则,关闭屏幕常开功能(屏幕会自动关闭)。

LCase

LCase(字符串表达式)

返回字符串的小写形式。

仅大写字母转换成小写字母;所有小写字母和非字母字符保持不变。

Left

Left(字符串, 长度)

返回指定数目的从字符串的左边算起的字符。

指定的长度为数值表达式,指明要返回的字符数目。如果是 0,返回空字符串 "";如果大于或等于字符串中的字符总数,则返回整个字符串。

Len

Len(字符串表达式)

返回字符串内字符的数目。

Log

Log(数字表达式)

返回数值的自然对数,即以常数 e 为底的对数。常数 e 的值约为 2.718282

LTrim

LTrim(字符串表达式)

返回不带前导空格的字符串。

Mid

Mid(字符串, 起始位置, 长度)

从字符串中返回指定数目的字符。

起始位置和长度都是数值类型的表达式。

Now

Now

根据计算机系统设定的日期和时间,返回当前的日期和时间值组成的字符串。

Oct

Oct(数值表达式)

返回表示八进制数值的字符串。当指定的数值表达式包含小数位时,会先采用四舍五入的方式去掉小数位再转换。

PutAttachment

PutAttachment(路径, 要释放的文件)

PutAttachment 路径

把当前脚本包含的附件释放到指定的目录下。

路径是字符串类型,表示把附件文件释放到某个特定的目录下。

如果路径为Null或空字符串,会把附件释放到按键精灵的临时文件目录下。临时文件目录可以通过调用 GetTempDir() 获得。

要释放的文件(可选参数)为字符串类型,可以指定只释放附件中的一个或几个文件,支持通配符 * ?

当不指定要释放的文件,或指定为Null或空字符串时,表示要释放本脚本附件中的所有文件。

Randomize

Randomize

Randomize 随机数种子

初始化随机数生成器。

Replace

Replace

(原字符串 , 查找的子字符串, 替换的字符串)

返回字符串,其中所有出现的某子字符串被替换为另一个字符串。

i="我爱你按键精灵"

ShowMessage Replace(i, "", "")

运行可以看到“你”字被替换为空字符串,运行结果为"我爱按键精灵"

RGB

RGB(数值R, 数值G, 数值B)

返回由红(由数值R表示)、绿(由数值G表示)、蓝(由数值B表示)三个分量组成的颜色值。

数值R, 数值G, 数值B的范围是0255之间的整数,返回的颜色值也是数值型。

Right

Right(字符串, 长度)

返回指定数目的从字符串的右边算起的字符。

指定的长度为数值表达式,指明要返回的字符数目。如果是 0,返回空字符串 "";如果大于或等于字符串中的字符总数,则返回整个字符串。

Round

Round(数值表达式)

返回经过四舍五入的数值。

RTrim

RTrim(字符串表达式)

返回不带后缀空格的字符串。

Sgn

Sgn(数值表达式)

返回表示数字符号的整数。

如果指定的数值表达式大于0,返回值为1;如果指定的数值表达式小于0,返回值为-1;如果指定的数值表达式等于0,返回值为0

Space

Space(数值表达式)

返回由指定数目的空格组成的字符串。

Split

Split(原字符串, 分隔符)

返回一个数组,数组中的每个元素都是子字符串。由这些子字符串和分隔符构成原字符串。

分隔符也是字符串类型。

Sqr

Sqr(数值表达式)

返回数值的平方根。

数值表达式的值必须大于或等于零。

StrComp

StrComp(字符串1, 字符串2)

返回两个字符串比较的结果。

当字符串1小于字符串2时,返回-1;当字符串1等于字符串2时,返回0;当字符串1大于字符串2时,返回1

StrReverse

StrReverse(字符串)

返回字符串,此字符串与指定字符串顺序相反。

String

String(数量, 指定字符)

返回具有指定长度的、重复字符组成的字符串。

指定字符可以是字符串类型表达式,若其中包含不止一个字符,则仅使用其中第一个字符。

指定字符也可以是数值类型表达式,表示字符的ASCII码。

Swipe

Swipe (点1的横坐标, 1的纵坐标, 2的横坐标, 2的纵坐标)

模拟手指在屏幕上的划动操作。从点1滑动到点2

Tan

Tan(数值表达式)

返回将某个角表示为弧度数值的正切值。

即取某个角并返回直角三角形两边的比值。此比值是直角三角形中该角的对边长度与临边长度之比。

将角度乘以 pi/180 即可转换为弧度,将弧度乘以 180/pi 即可转换为角度。

TracePrint

TracePrint(表达式)

将表达式转换为字符串类型后,发往按键精灵手机助手,并在按键精灵手机助手的调试栏显示出来。

Trim

Trim(字符串表达式)

返回不带前导空格和后缀空格的字符串。

UCase

UCase(字符串表达式)

返回字符串的大写形式。

仅小写字母转换成大写字母;所有大写字母和非字母字符保持不变。

Vibrate

Vibrate(数值表达式)

在具有震动功能的设备上,维持震动一段时间。

维持的时间由数值表达式指定,表示以毫秒数为单位的时间。

GetDeviceID

GetDeviceID

返回设备的唯一编号

FindColor

FindColor

在屏幕中指定区域内,查找是否存在某个指定颜色。若找到,将找到的点的左边置于后两个参数(通常为变量)中;如果没有找到,则后两个参数均被置为-1

16进制颜色值可以为字符串,格式为"BBGGRR",亦可为此字符串对应的16进制数值。

查找方式为0时,表示从左上向右下查找;为1时,表示从中心往四周查找;为2时,表示从右下向左上查找;为3时,表示从左下向右上查找;为4时,表示从右上向左下查找。

相似度为01之间的数值。此数值为1时,屏幕上的颜色必须与指定的颜色完全一致才算找到;否则,当存在少量偏差时也算找到。此数值越小,允许的颜色偏差范围越大。

FindPic

FindPic

在屏幕中指定的区域内,查找是否存在某个图片文件所指定的图像。如果找到,将找到的点的左边置于后两个参数(通常为变量)中;如果没有找到,则后两个参数均被置为-1

16进制颜色值可以为字符串,格式为"BBGGRR",亦可为此字符串对应的16进制数值。

查找方式为0时,表示从左上向右下查找;为1时,表示从中心往四周查找;为2时,表示从右下向左上查找;为3时,表示从左下向右上查找;为4时,表示从右上向左下查找。

相似度为01之间的数值。此数值为1时,屏幕上的颜色必须与指定的颜色完全一致才算找到;否则,当存在少量偏差时也算找到。此数值越小,允许的颜色偏差范围越大。

支持的图片文件格式包括PNGBMPJPG等,推荐用PNG格式,PNG格式图片中所指定透明点表示该点不会参与匹配过程的计算,也就是该点与屏幕上的任何颜色都会匹配成功。

图片文件名如果以 "Attachment:" 开始,表明后面的部分是附件中的文件。按键精灵会自动从附件中找到该文件并进行找图,不需要将附件释放到存储卡上。

Delay

Delay

脚本暂停执行一段时间。数值表达式指定了延时的“毫秒”数。例如:

1秒=1000毫秒 1分钟=60000毫秒 1小时=3600000毫秒

GetScreenX

GetScreenX

返回当前屏幕的横向分辨率,即以像素数表示的屏幕宽度。

GetScreenY

GetScreenY

返回当前屏幕的纵向分辨率,即以像素数表示的屏幕高度。

GetScreenColorDep

GetScreenColorDep

返回当前屏幕的颜色深度,即每个像素用多少个二进制位(Bit)表示,通常屏幕的颜色深度为162432

GetTempDir

GetTempDir

返回存储卡上按键精灵的临时文件目录,可以在此目录中进行文件操作。

ColorToRGB

ColorToRGB

把颜色分解为红、绿、蓝三个分量,分别保存在变量R,变量G,变量B中。

16进制颜色值可以为字符串,格式为"BBGGRR",也可以为此字符串对应的16进制数值。

ColorDiff

ColorDiff

返回两个颜色的红、绿、蓝三个分量的差值之总和。

GetPixelColor

GetPixelColor

返回屏幕上指定点的颜色。由两个数值型表达式指定该点的横坐标和纵坐标(以像素为单位)。

返回的颜色值也是数值型。

InputText

InputText

在当前窗口中输入文字。例如:InputText "你好,我是按键精灵"

KeyPress

KeyPress

先“按下”再“弹起”键,模拟我们平时的按键操作。

指定的按键可以是字符串类型,表示某个键的名字,也可以是数值类型,表示某个键的编码。

KeyDown

KeyDown

“按下”键,模拟我们平时的“按下”操作

指定的按键可以是字符串类型,表示某个键的名字,也可以是数值类型,表示某个键的编码。

KeyUp

KeyUp

“弹起”键,模拟我们平时的“弹起”操作

指定的按键可以是字符串类型,表示某个键的名字,也可以是数值类型,表示某个键的编码。

KillApp

KillApp

指定某个应用程序的包名,关闭这个应用程序。

PlaySound

PlaySound 文件名

播放指定的音频文件,其中文件名为字符串类型的表达式,指明了音频文件的存储位置。

Rnd

Rnd

返回一个小于 1 但大于或等于 0 的随机数。

在调用 Rnd 之前,先使用 Randomize 语句初始化随机数生成器。

要产生指定范围的随机整数,请使用以下公式:

Int((upperbound - lowerbound + 1) * Rnd + lowerbound)

这里,upperbound 是此范围的上界,而 lowerbound 是此范围内的下界。

RunApp

RunApp

指定某个应用程序的包名,启动这个应用程序。

ShowMessage

ShowMessage

在屏幕上显示提示信息,此信息将会维持一定时间后自动消失。

如果提示信息不是字符串类型,会自动转换为字符串类型进行显示。

SnapShot

SnapShot 文件名

截屏并保存为PNG格式的图片文件。

Time

Time

返回当前系统时间。

Touch

Touch 横坐标, 纵坐标, 持续时间

点击屏幕上的指定位置,并持续按住一段时间再松开。

Tap

Tap 横坐标, 纵坐标

短暂点击屏幕上指定的位置

新增命令hot

KeepCapture

call KeepCapture()

变量=KeepCapture()

KeepCapture的作用是截一次图,并把截图结果暂时保留下来,后续的找图、找色、取色都会直接从这个截图里面操作。而不会重新截图。此命令激活会大大加快后续的找图找色指令速度和效率!

ReleaseCapture

ReleaseCaptureKeepCapture成对使用,解除KeepCapture的效果,也就是说,后续的找图、找色、取色每次都会重新截图

ReleaseCaptureKeepCapture成对使用,解除KeepCapture的效果,也就是说,后续的找图、找色、取色每次都会重新截图

KeepScreen

KeepScreen Bool类型表达式

当指定的Bool类型表达式为True的时候,保持屏幕常开状态;否则,关闭屏幕常开功能(屏幕会自动关闭)。

ShowMessage

ShowMessage 提示信息

在屏幕上显示提示信息,此信息将会维持一定时间后自动消失。

如果提示信息不是字符串类型,会自动转换为字符串类型进行显示。

Swipe

Swipe 点1的横坐标, 点1的纵坐标, 点2的横坐标, 点2的纵坐标

模拟手指在屏幕上的划动操作。从点1滑动到点2。

Dim 移动版必须要声明变量才能使用。(PC按键无需声明)

Dim 变量1, 变量2 ...

定义一个或多个变量。

TouchDown

TouchDown 横坐标,纵坐标

按下屏幕上指定位置的点(横坐标,纵坐标)

TouchMove

TouchMove 横坐标,纵坐标

模拟滑动操作,将按下的点滑动至屏幕上的指定的位置(横坐标,纵坐标),滑动前需要先调用前需要先调用touchDown函数。

TouchUp

TouchUp

弹起touchDown函数按下的点,一般与touchDown函数匹配使用。

[backcolor=rgb(254, 254, 233)]
2014-3-6 10:27 上传
下载附件 (51.55 KB)



天天爱消除作为例子,以往使用找色方式制作刷分脚本,在识别颜色过程中,脚本运行逻辑的流程繁琐,反复截图的过程也是较慢的,例如,49个方格便需要截图并取色49次,再进行逻辑判断执行。

然而通过目前新增的两条命令语句,在上述同样的场景当中,对比原先找色的写法,同样是取色49次,但截图只有一次,可以有效增加49倍效率,当截图中获取的命令执行完毕后,再重新截图开始执行,合理重复这两个动作,因此将大大提高效率与速度。


    已有5评分我要评分查看所有评分

    本主题由 超级版主 瑞祥幽冥狼 于 2022/2/10 14:12:43 执行 删除帖子 操作
    2#

    谢谢分享~

    3#

    我看看。洗洗澡

    4#

    REEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE

    5#

    新人求罩,学习学习

    6#

    学习学习

    7#

    学习了

    8#

    xcgbds sdg se hrr rhy dgs sdg shsd jdhd sdfas jdfs

    9#

    新手路过学习,谢谢分享!

    10#

    支持一下,顶起来,希望安卓版越来越强大

    11#

    看看考虑考虑考虑

    12#

    怎么让多个脚本同时运行。。。

    13#

    该用户帖子内容已被屏蔽

    14#

    全局变量代码是什么

    15#

    网页访问的命令是哪个

    16#

    谢谢了!学习下

    17#

    bfmogmss19883edfef33477f26570dc443e1333f62c9
    送大家个大漠注册码,里面还剩1000多元,工作室倒闭了,不用了,大家试试就知道,试试又没损失什么的,用好记起来吧 现代雷锋

    18#

    我来学习了

    19#


    20#


    发新话题 回复该主题