上一篇文章,【AHK】打造炒股利器系列——语音报时器 作为AHK入门,讲解了 注释、赋值、if语句、逻辑运算符、定时器等基本知识。本篇将引入Array和Loop语句来简化化这个语音报时器,让代码更优雅,代码越简单越不容易出错误,老话说秃头上的虱子明摆着嘛。
先放上简化后的代码,然后再针对初级AHK使用者展开讲解Array、Loop、MsgBox等指令。
#Persistent
#SingleInstance force
/**
*【AHK】打造炒股利器系列——用数组和循环来简化语音报时器
* 作者:liuyukuan
* 版权声明:未经授权,不得转载
* 最新版发布在:https://blog.csdn.net/liuyukuan/
*/
; 定义两个数组: 一个是存放时间的数组times;另一个是存放对应消息的数组messages。
times := ["09:00:00", "09:15:00", "09:25:00", "09:30:00", "11:30:00", "13:00:00", "14:45:00", "15:00:00"]
messages := ["早盘下载数据", "开始集合竞价", "距开盘还有五分钟", "上午开盘", "中午收盘", "下午开盘", "距收盘还有十五分钟", "全天收盘"]
; 创建 一个 字转语音(TTS )COM 对象
Aladdin := ComObjCreate("sapi.spvoice")
; 设定定时器 每 0.5秒 运行一次
SetTimer, 定时器, 500
return
定时器:
FormatTime, 当前时间,, HH:mm:ss
; 用Loop循环来遍历 times 数组
Loop, % times.Length()
{
if (当前时间 = times[A_Index])
{
Aladdin.Speak(messages[A_Index])
break
}
}
return
简单数组 Array的基本用法
创建数组
有两种方法可以用:
数组:= ["one", "two", "three"]
数组:= Array(Item1, Item2, ..., ItemN)
读取数组
想取出数组arr
的第i
项元素,直接把序号i
放到数组名称后面的方括号里即可。
数组arr的第3项的值 := arr[3]
循环遍历数组
可以通过Loop或 For 循环实现. 例如:
array := ["one", "two", "three"]
; Length返回数组项目的数量:
Loop % array.Length()
MsgBox % array[A_Index]
; 枚举数组内容:
For index, value in array
MsgBox % "Item " index " is '" value "'"
普通循环Loop的基本用法
重复执行一系列命令: 可以指定表示重复次数的数字或直到遇到 break.
Loop [, Count]
参数
Count
执行循环体(重复) 的次数. 如果省略, Loop 会无期限继续, 直到遇到 break 或 return.
如果 Count 是一个变量引用例如 %ItemCount%, 每当此变量为空或包含小于 1 的数字时, 循环会被完全跳过.
备注
内置变量 A_Index
包含当前循环重复的次数. 首次执行循环体时其值为 1. 第二次时其值为 2; 依此类推. 如果一个内层循环包含在一个外层循环中, 那么内层循环具有优先权. A_Index 在所有类型的循环中都有效, 包括文件循环和注册表循环; 但是在循环外部时 A_Index 值为 0.
示例1: 创建一个有 3 次迭代的循环.
;循环3次,内置变量A_Index 将依次为 1, 2, 接着 3
Loop, 3
{
MsgBox, 迭代次数是 %A_Index%.
Sleep, 100
}
小扩展:MsgBox
MsgBox语句可以创建一个小对话框窗口,用于输出提示信息,方便用户与程序交互。小窗口中可以含有一个或多个按钮(例如 “是” 和 “否”) 。
消息框通常看起来像这样:
创建消息框的语法是:
MsgBox, Text
或者
MsgBox [, Options, Title, Text, Timeout]
参数说明
Text(文本)
如果省略所有的参数, 消息框会显示 “Press OK to continue.” 文本. 否则, 此参数表示消息框中显示的文本, 用来引导用户如何操作或提示信息.
可以使用转义序列来显示特殊字符. 例如, `n 表示换行符, 它结束当前行并开始一个新行. 因此使用 text1`n`ntext2 会在 text1 和 text2 之间添加一个空行.
如果 Text 较长, 可以通过延续片段的方法将其分解成较短的几行, 这样可以增加可读性和可维护性.
Options(选项)
表示消息框的类型和可能的按钮组合. 如果为空或省略, 则默认为 0. 注意哈:可以累加的,比如:两个按钮为0x1,感叹号图标0x30,置顶模式0x1000,那么只需设置0x1031.
MsgBox 0x1031,提示,Hello World!
若要指定在消息框中显示的按钮, 请添加以下值 之一:
功能 | 十进制值 | 十六进制值 |
---|---|---|
确定(即仅显示一个 “确定” 按钮) | 0 | 0x0 |
确定/取消 | 1 | 0x1 |
终止/重试/忽略 | 2 | 0x2 |
是/否/取消 | 3 | 0x3 |
是/否 | 4 | 0x4 |
重试/取消 | 5 | 0x5 |
取消/重试/继续 | 6 | 0x6 |
除了按钮外,还可以设置图标的
要在消息框中显示一个图标, 请添加以下值 之一:
功能 | 十进制值 | 十六进制值 |
---|---|---|
错误图标(停止/错误) | 16 | 0x10 |
问号图标 | 32 | 0x20 |
惊叹号图标 | 48 | 0x30 |
星号图标(信息) | 64 | 0x40 |
如需要对话框置顶,不被其他窗口遮挡,须指定对话框的模式 0x1000 :
功能 | 十进制值 | 十六进制值 |
---|---|---|
系统模式(总是在顶部) | 4096 | 0x1000 |
任务模式 | 8192 | 0x2000 |
置顶(WS_EX_TOPMOST 样式) (和系统模式类似, 但省略了标题栏图标) | 262144 | 0x40000 |
Title(标题)
消息框窗口的标题. 如果省略或为空, 那么它默认为脚本的名称(不含路径).
Timeout(超时)
(可选) 以秒为单位的超时时间
总结
本文以简化上一篇【AHK】打造炒股利器系列——语音报时器](https://blog.csdn.net/liuyukuan/article/details/142388396)中的代码为例,讲解了Array、 Loop 、MsgBox等AHK指令。