【笔记】按键精灵2014

前言

按键精灵2014学习笔记
按键精灵2014的脚本是基于VB开发的,可以使用部分VB内置命令;按键精灵X的脚本是基于Lua开发的
源码的后缀名为.Q,但是文件中不仅包含了源码,还包含了文件属性,可以通过按键精灵2014的编辑器来修改和调试源码

注释

1
2
3
// 注释内容

' 注释内容

延时

<num>:延迟的时间,单位毫秒

1
Delay <num>

声明变量

  • 按键精灵2014的变量名可以是中文
1
Dim 变量名

声明全局变量

1
DimEnv 变量名

定义变量

  • 为变量赋值
1
变量名 = 变量值

定义用户变量

  • 用于可以传递参数的小精灵传来的参数
1
UserVar 变量名 = "参数默认值" "提示信息"

输出到控制台

1
TracePrint 变量名

数据类型

字符串

字符串拼接

  • 通过&进行字符串拼接
1
"文本内容"&"文本内容"

字符串分割

1
2
3
字符串数组变量名 = Split(字符串, "分割符")

字符串数组第一个值 = 字符串数组变量名(0)
查找子字符串
  • 查找子字符串在父字符串中的位置,如果没有找到返回0
1
InStr("父字符串", "子字符串")
替换子字符串
1
Replace("父字符串", "旧的子字符串", "新的子字符串")
倒置字符串中的字符顺序
  • 返回倒置后的新字符串
1
变量 = StrReverse("字符串")
截取字符串
1
Mid(字符串, 开始截取下标, 步长)

转义字符

换行符

  • 光标移到下一行
1
Chr(10)
  • 光标移到下一行开头
1
Chr(13)

数组

定义数组

1
数组名 = Array(值, 值)

获取数组长度

1
Ubound(数组名)

运算符

比较运算符

  • <>

逻辑运算符

  • AndOrNot

循环语句

Where循环

  • 如果无限循环,循环条件设置为True
1
2
3
While 循环条件
...
Wend

For循环

<num>:循环次数

1
2
3
For <num>
...
Next
1
2
3
For 0 To 1
...
Next

条件语句

数值判断

1
2
3
4
5
IF 条件 Then
...
ElseIf 条件
...
End If

颜色判断

获取鼠标当前位置的颜色值

  • 获取鼠标当前位置的6位十六进制颜色值
1
变量名 = GetPixelColor(像素点横坐标, 像素点纵坐标)

定位找色

<x>:x轴坐标
<y>:y轴坐标
FFFFFF:十六进制颜色值
0表示相同,1表示不相同,2表示相似

1
2
3
4
5
IfColor <x>,<y>,"FFFFFF",0 Then
...
Else
...
End If

区域找色

  • 在一个区域内从左上角开始找色,按照先从左再到右、先从上再到下的顺序

<x_start>,<y_start>:选区左上角的横纵坐标
<x_end>,<y_end>:选区右下角的横纵坐标
intX:返回值,找到的结果x坐标,如果找不到就返回小于1的数
intY:返回值,找到的结果y坐标,如果找不到就返回小于1的数

1
2
3
4
FindColor <x_start>,<y_start>,<x_end>,<y_end>,"FFFFFF",intX,intY
If intX > 0 And intY > 0 Then
...
End If
更多配置

<mod>:指定找色模式

0:从左上到右下
1:从中心开始
2:从右下到左上

<similarity>:指定颜色相似度,范围[0,1]

1
2
3
4
FindColorEx <x_start>,<y_start>,<x_end>,<y_end>,"FFFFFF",<mod>,<similarity>,intX,intY
If intX > 0 And intY > 0 Then
...
End If

图片判断

  • 先将图片添加到附件

按键精灵只能识别.bmp格式的位图
不能找单色图片
如果图片的四个角的像素点的颜色一样,则该图片中存在的所有该颜色都视为透明

  • 再在代码中引用图片

<filename>.bmp:附件中的图片名

1
2
3
4
FindPic <x_start>,<y_start>,<x_end>,<y_end>,"<filename>.bmp",<similarity>,intX,intY
If intX > 0 And intY > 0 Then
...
End If

查找标准色块数量

相似度:取值范围为[0,1]
颜色值:6位的十六进制颜色值,顺序是BGR

1
变量名 = Plugin.Color.CountBlockNum(左上角横坐标, 左上角纵坐标, 右下角横坐标, 右下角纵坐标, 颜色值, 相似度)
后台查找标准色块数量
  • 同一种颜色形成的整体就是一个色块
1
变量名 = Plugin.Bkgnd.CountBlockNum(窗口句柄, 左上角横坐标, 左上角纵坐标, 右下角横坐标, 右下角纵坐标, 颜色值, 相似度)
后台查找标准色块位置
1
变量名 = Plugin.Bkgnd.GetBlockRange(窗口句柄, 左上角横坐标, 左上角纵坐标, 右下角横坐标, 右下角纵坐标, 颜色值, 相似度)

操作鼠标

获取鼠标当前位置的坐标

1
GetCursorPos x, y

移动鼠标

绝对定位移动

  • 屏幕坐标系的原点为屏幕左上角,向右为x轴的正方向,向下为y轴的正方向

<x>:x轴坐标
<y>:y轴坐标

1
MoveTo <x>,<y>

相对定位移动

<x>:横坐标的增量,正数为向右,负数为向左
<y>:纵坐标的增量,正数为向下,负数为向上

1
MoveR <x>,<y>

左键单机

<num>:单机次数

1
LeftClick <num>

操作键盘

程序暂停等待按键

  • 按下非终止程序快捷键以外的键,程序才会继续运行
1
WaitKey

获取按下的键码值

1
变量名 = WaitKey()

检测上次按过的键

  • 获取键盘上一次按下的键码值,包括程序未运行时按下的按键
  • 默认没有按键按下时得到的值为0
  • 检测到按键后会立即将键码值赋值给变量,如果之后没有按键继续按下,变量值会恢复为0
1
变量名 = GetLastKey()

输出字符串

1
SayString "文本内容"

后台输出字符串

  • 后台按下回车
1
Call Plugin.Bkgnd.SendString(句柄变量名, "文本内容")

按下指定按键

  • 按下回车

<num>:按键按下次数

1
KeyPress "Enter", <num>

后台按下指定按键

  • 后台按下回车

键码值

13:回车键

1
Call Plugin.Bkgnd.KeyPress(句柄变量名, 键码值)

字符转键码值

1
Asc("字符")

弹出消息窗

1
MessageBox "文本内容"

屏幕输出文本框

  • 文本字号为16像素
  • 文本框的颜色为白底
  • 超出文本框的文字会被隐藏

颜色值:6位的十六进制颜色值,顺序是BGR

1
Call Plugin.Msg.ShowScrTXT(文本框左上角横坐标, 文本框左上角纵坐标, 文本框右下角横坐标, 文本框右下角纵坐标, "文本内容", 颜色值)

清除文本框

1
Plugin.Msg.HideSrcTXT

状态栏图标气泡

1
Call Plugin.Msg.Tips("文本内容")

子程序

定义子程序

  • 子程序名可以是中文

无参

1
2
3
4
5
Sub 子程序名

...

End Sub

有参

1
2
3
4
5
Sub 子程序名(形参名, 形参名)

...

End Sub

调用子程序

无参

1
Call 子程序名

有参

1
Call 子程序名(值, 值)

窗口句柄

获取窗口句柄

通过鼠标的位置获取窗口句柄

1
句柄变量名 = Plugin.Window.MousePoit()

通过类名获取窗口句柄

获取根级的窗口句柄
1
句柄变量名 = Plugin.Window.Find("窗口类名", "窗口标题")
  • 如果模糊查找,可以不给窗口标题参数
1
句柄变量名 = Plugin.Window.Find("窗口类名", 0)
获取子级的窗口句柄
1
子窗口句柄变量名 = Plugin.Window.FindEx(句柄变量名, 0, 0, 0)

通过窗口句柄获取窗口位置

1
窗口位置变量 = Plugin.Window.GetWindowRect(句柄变量名)
1
左上角横坐标|左上角纵坐标|右下角横坐标|右下角纵坐标

通过窗口句柄操作鼠标

单机左键

  • 这种方式操作鼠标时,无论是否在屏幕内,无论是否在前台,都可以正常执行点击
1
Call Plugin.Bkgnd.LeftClick(句柄变量名, 相对于窗口左上角的横坐标, 相对于窗口左上角的纵坐标)

生成随机数

  • 生成随机数范围为[0,1)的随机数

<seed>:随机数种子类型

大于0、省略:将生成的随机数列表中的下一个随机数作为随机数种子
小于0:使用该值作为随机数种子,每次都相同
0:使用最近生成的数作为随机数种子

1
Rnd()

生成指定范围的随机数

<max>:最大值
<min>:最小值

1
Int((<max> - <min> + 1) * Rnd + <min>)

重置随机数种子

1
Randomize

事件

脚本停止运行事件

1
2
3
Sub OnScriptExit()

End Sub

点击事件

Form1:第一个窗口
Button1:第一个按钮

1
2
3
Event Form1.Button1.Click
...
End Event

窗体加载事件

1
2
3
Event Form1.Load
...
End Event

QUI组件

文本框

获取文本框内容

1
Form1.ImpotBox.Text
转换为整型
1
Int(Form1.ImpotBox.Text)

修改文本框内容

1
Form1.ImpotBox.Text = "文本内容"

下拉列表

定义所有选项

前端显示
1
Form1.ComboBox1.List = "是|否"
后段实际数据
1
2
3
4
subfix = Array(true, false)
If subfix(Form1.ComboBox1.ListIndex) == true Then

End If

定义默认选项

1
Form1.ComboBox1.ListIndex = 0

文件选择

  • 弹出一个文件选择窗口
  • 返回选择的文件的绝对路径
1
变量名 = Plugin.File.SelectFile()

运行程序

<src>:文件绝对路径

1
RunApp <src>

多线程

启动线程

1
2
3
4
5
6
7
8
9
10
BeginThread 子程序名1
BeginThread 子程序名2

Sub 子程序名1
...
End Sub

Sub 子程序名2
...
End Sub

获取线程ID

  • 启动线程后会返回线程ID
1
线程ID = BeginThread 子程序名

停止指定线程

1
StopThread 线程ID

继续线程

1
ContinueThread 线程ID

配置文件

小精灵配置文件

  • 在小精灵同级目录下创建uservar.ini配置文件

<uuid>:UUID
<value>:值

uservar.ini
1
2
[<uuid>]
Form1.InputBox1.Text=<value>

写入自定义配置文件

  • 配置文件不存在则会自动创建
1
Call Plugin.File.WriteINI("小节", "键", "值", "C:\Config.ini")

读取自定义配置文件

1
变量名 = Plugin.File.ReadINI("小节", "键", "C:\Config.ini")

获取当前时间

从当前系统获取时间

1
变量名 = Plugin.Sys.GetDateTime()

从网络获取时间

1
变量名 = lib.网络.获取网络时间()

字符串作为命令执行

1
Execute("文本内容")

读写文件

打开文件

  • 如果打开成功会返回文件句柄
  • 如果打开失败会返回-1
1
文件句柄 = Plugin.File.Open("文件路径")

关闭文件

1
Call Plugin.File.Close(文件句柄)

读取文件

按行读取文件

  • 行首可能会包含上一行末尾的换行符
1
2
3
4
变量名 = Plugin.File.ReadLine(文件句柄)
While 句柄变量名 <> ""
变量名 = Plugin.File.ReadLine(文件句柄)
Wend

设置文件读写位置

1
Call Plugin.File.SeekFile(文件句柄, 位置)

获取文件内容长度

1
变量名 = Plugin.File.GetFileLength("文件路径")

写入文件

文件末尾追加一行文本

1
Call Plugin.File.WriteFileFx("文件路径", "文本内容")

在当前光标处写入文本

  • 写入时会进行覆盖操作,且只覆盖新的数据的长度
1
Call Plugin.File.WriteFile("文本内容")
在文件末尾追加写入
1
2
3
文件内容长度 = Plugin.File.GetFileLength("文件路径")
Call Plugin.File.SeekFile(文件句柄, 文件内容长度)
Call Plugin.File.WriteFile("文本内容")

在当前光标处写入一行文本

1
Call Plugin.File.WriteLine("文本内容")
在文件末尾追加写入
1
2
3
文件内容长度 = Plugin.File.GetFileLength("文件路径")
Call Plugin.File.SeekFile(文件句柄, 文件内容长度)
Call Plugin.File.WriteLine(Chr(13) & "文本内容")

读写Excel文件

打开Excel文件

1
Call Plugin.Office.OpenXls("文件路径")

关闭文件

1
Call Plugin.Office.CloseXls()

写入文件

工作簿下标:从1开始
单元格行的下标:从1开始
单元格列的下标:从1开始

1
Plugin.Office.Write(工作簿下标, 单元格行的下标, 单元格列的下标, "文本内容")

发送HTTP请求

Get

False:是否是异步请求

1
2
3
4
5
6
7
8
9
Set xPost = createObject("Msxml2.ServerXMLHTTP3.0")
xPost.Open "Get", "http://localhost?key=value", False
xPost.Send
Delay 10
If xPost.readyState = 4 Then
变量名 = xPost.responsetext
End If
xPost.abort
Set xPost = Notbing

Post

False:是否是异步请求

1
2
3
4
5
6
7
8
9
Set xPost = createObject("Msxml2.ServerXMLHTTP3.0")
xPost.Open "Post", "http://localhost", False
xPost.Send("key=value")
Delay 10
If xPost.readyState = 4 Then
变量名 = xPost.responsetext
End If
xPost.abort
Set xPost = Notbing

保存截图

1
Plugin.Pic.PrintScreen(左上角横坐标, 左上角纵坐标, 右下角横坐标, 右下角纵坐标, 图片保存路径)

操作剪贴板

获取剪贴板内容

1
变量名 = Plugin.Sys.GetCLB()

函数

  • 函数和子程序基本相同
  • 函数可以有返回值,子程序没有返回值
1
2
3
Function 函数名
...
End Function
  • 为函数名同名的变量名赋值,即可赋值给返回值
1
2
3
Function 函数名
函数名 = 返回值
End Function

命令库

  • 在命令库右键->新建->定义命令名称->确定

  • 在命令代码区中添加多个子程序或函数

  • 调用命令

1
Lib.命令库名.命令名(参数列表)

完成

参考文献

哔哩哔哩——酷玩蚊仔
哔哩哔哩——沧桑大侠