While
AHK
提供三种循环方法,分别是Loop, While
和For
,其中While
和For
在其他语言中都很常见,下面通过while
循环,实现一个鼠标框选矩形尺寸的脚本
; 来自官网的案例
CoordMode "Mouse", "Screen"
~LButton::
{
MouseGetPos &begin_x, &begin_y
while GetKeyState("LButton")
{
MouseGetPos &x, &y
ToolTip begin_x ", " begin_y "`n" Abs(begin_x-x) " x " Abs(begin_y-y)
Sleep 10
}
ToolTip
}
其中,MouseGetPos
可以获得鼠标的位置,并将其赋值给begin_x, begin_y
。然后,GetKeyState
可获取鼠标或键盘的状态,当LButton
即鼠标左键处于按压状态时,执行while
循环的语句,首先获取当前的x,y
坐标,然后弹出一个ToolTip
,用于显示鼠标框选出的矩形尺寸,结果如下
相比之下,For
循环稍显复杂,用于迭代某个列表,考虑到For循环与可迭代类型息息相关,故而放在后面与可迭代对象一起讲解。
Loop
和While
和For
相比,最简单的循环方式其实是Loop
,在不加参数的情况下,就是一个死循环,如果用Loop
改写上面的函数,则内容如下
CoordMode "Mouse", "Screen"
~LButton::
{
MouseGetPos &begin_x, &begin_y
Loop
{
if not GetKeyState("LButton")
break
MouseGetPos &x, &y
ToolTip begin_x ", " begin_y "`n" Abs(begin_x-x) " x " Abs(begin_y-y)
Sleep 10
}
ToolTip
}
其中,break
用于跳出循环,这个关键字不仅适用于Loop
循环,也同样适用于其他循环。
带参数的Loop
如果Loop
后面跟着不同的参数,则其含义又有不同,根据参数类型,AHK
共提供了五种Loop
格式,可对文件夹、字符串以及文件进行遍历。
- 数字 表示执行循环的次数
Loop Files
将检索指定的文件夹Loop Parse
将检索字符串片段Loop Read
将按行读取文件内容Loop Reg
检索指定注册表子键的内容,每次一个项目
由于类似Loop 3
这种循环3次的语法相对比较简单,而注册表操作相对来说并不高频,更适合将Loop Reg
放在注册表操作中讲解,故而下面主要对Files, Parse, Read
这三种Loop循环进行示例说明。
Loop Parse
Loop Parse
用于遍历字符串,其参数除了将要被调用的字符串外,还包括另外两个可缺省的参数
Delimiters
用于分割字符串的字符串OmitChars
字符串在分割之后,在首尾移除的字符
下面用逗号来分割剪贴板中的内容,并逐段输出
CapsLock::{
Loop Parse, A_Clipboard, ","{
MsgBox A_LoopField
}
}
在点击CapsLock
后,效果为
Loop Files
Loop Files
的完整调用参数为Loop Files FilePattern , Mode
,其中FilePattern
为支持通配符的路径字符串;Mode
可缺省,此时只包括文件且不递归子文件夹,此外可以指定D, F, R
三种模式,含义如下
- D 包含文件夹
- F 包含文件
- R 递归到子目录,即对文件夹所有子文件进行遍历。
下面遍历所有.ex
结尾的文件
CapsLock::{
FileList := ""
Loop Files, "*.ex"
MsgBox A_LoopFileName
}
其中,A_LoopFileName
表示单次循环时的文件名。
Loop Read
Loop Read
用于打开文件并按行遍历,其内置变量A_LoopReadLine
即表示某次循环时的某一行
CapsLock::{
Loop read, "test.ahk"{
MsgBox A_LoopReadLine
}
}
效果如下