# 变量和表达式

## 目录

- 变量
- 表达式
- 表达式中的运算符
- 内置变量
- 变量的容量和占用内存

## 变量

有关一般说明和变量如何工作的详细信息, 请参阅变量.

给变量赋值: 要将字符串或数字存储在变量中, 有两种方法: 传统方式和表达式. 传统方法使用等号运算符(=) 来指定不加引号的原义字符串或用百分号括起来的变量. 例如:

    MyNumber = 123
    MyString = This is a literal string.
    CopyOfVar = %Var%  ; 和 = 运算符一起使用时, 需要使用百分号来获取变量的内容.

与之相比, 表达式方法使用冒号等号运算符(:=) 来保存数字, 加引号的字符串和其他类型的表达式. 以下示例在功能上与前面的例子相同:

    MyNumber := 123
    MyString := "This is a literal string."
    CopyOfVar := Var  ; 和前面段落中与其作用相同的语句不同, 百分号不和 := 运算符一起使用.

后一种方法由于其更清晰并且与其他许多语言几乎一致的表达式语法成为大多数人的首选方法.

从上面的例子中您可能已经想到了有两种方法来清除变量的内容(即让变量为空):

    MyVar =
    MyVar := ""

上面的这对空引号只能和 := 运算符一起使用, 因为和 = 运算符一起使用时, 则会在变量中保存两个原义的引号字符.

获取变量的内容: 如同赋值有两种方法, 获取变量的内容也有两种方法: 传统方法和表达式方法. 传统方法需要将变量名包围在百分号中来获取变量的内容. 例如:

    MsgBox The value in the variable named Var is %Var%.
    CopyOfVar = %Var%

与之相比, 表达式方法省去了变量名两边的百分号, 但原义的字符串必须包围在双引号中. 所以, 下面的表达式作用等同于上面的例子:

    MsgBox % "The value in the variable named Var is " . Var . "."  ; 使用句点连接(join 拼接) 两个字符串.
    CopyOfVar := Var

在上面的 MsgBox 这行, 通过使用百分号和空格把参数从传统模式改变为表达式模式. 因为所有的命令默认情况下使用传统模式(除了另外注明的那些), 所以这是必须的.

变量的比较: 请阅读下面表达式部分中关于不同类型变量比较的重要提示, 尤其是关于何时使用小括号的内容.

## 表达式

有关结构化概述和进一步说明, 请参阅表达式.

表达式用来对一系列变量, 原义字符串和/或原义数字执行一个或多个操作.

表达式中的变量名称不用包围在百分号中(伪数组和其他的双重引用除外). 所以, 为了与变量区别, 原义的字符串必须用双引号包围. 例如:

    if (CurrentSetting > 100 or FoundColor != "Blue")
        MsgBox The setting is too high or the wrong color is present.

在上面的例子中, 因为 "Blue" 是原义字符串, 所以包围在双引号中. 要在原义字符串中包含 真实的 引号字符, 请指定两个连续的引号, 如同此例中的两次演示: `"她说, ""一天一个苹果."""`.

注意: 有几种类型的 If 语句看起来像表达式, 但实际上不是.

空字符串: 要在表达式中使用空字符串, 请指定一对空引号. 例如, 当 MyVar 非空时语句 `if (MyVar != "")` 的结果为真. 然而, 在传统 if 语句中, 一对空引号会被视为原义的字符串. 例如, 当 MyVar 仅包含一对真实的引号时语句 `if MyVar = ""` 结果为真. 因此, 要使用传统的 if 语句判断变量是否为空, 则需要让 = 或 != 的右侧为空, 例如: `if Var =`.

相关提示, 任何无效的表达式例如 `(x +* 3)` 会产生空字符串.

保存表达式的结果: 要把结果赋值给变量, 请使用 := 运算符. 例如:

    NetPrice := Price * (1 - Discount/100)

布尔值: 要计算表达式结果为真还是假时(例如 IF 语句), 表达式结果为空或零被视为假, 而其他所有结果都视为真. 例如, 仅当 ItemCount 为空或 0 时 `if ItemCount` 的结果才为假. 类似地, 表达式 `if not ItemCount` 将产生相反的结果.

像 NOT/AND/OR/>/=/< 这些运算符的运算会自动产生真值或假值的结果: 真值时结果为 1 而假值时为 0. 例如, 在下面的表达式中, 如果有一个条件为真则变量 Done 被赋值为 1:

    Done := A_Index > 5 or FoundIt

如上面提示的那样, 简单地置空变量或为其赋值为 0 可以让它为假值. 利用这种特性, 可以使用简写语句 `if Done` 来检查变量 Done 是真还是假.

单词 true 和 false 是值分别为 1 和 0 的内置变量. 使用它们可以增加脚本的可读性, 例如:

    CaseSensitive := false
    ContinueSearch := true

整数和浮点数: 在表达式中, 含有小数点的数字被视为浮点数; 否则视为整数. 对于大多数运算符(例如加法和乘法), 只要其中的一个输入是浮点数, 那么结果也将是浮点数.

不论在表达式中还是在表达式外的其他地方, 整数都可以表示成十六进制或十进制. 十六进制数必须以前缀 0x 开头. 例如, `Sleep 0xFF` 等同于 `Sleep 255`. [v1.0.46.11+]: 可以识别用科学计数法表示的浮点数; 但只有在它们含有小数点时才行(例如 `1.0e4` 和 `-2.1E-4`).

强制使用表达式: 通过在表达式前加上百分号和空格或 tab, 能把表达式用在不直接支持表达式的参数中(除了像 StringLen 的 OutputVar 和 InputVar 的那些参数). 这种技巧常用来访问数组. 例如:

    FileAppend, % MyArray%i%, My File.txt
    FileAppend, % MyPseudoArray%i%, My File.txt
    MsgBox % "The variable MyVar contains " . MyVar . "."
    Loop % Iterations + 1
    WinSet, Transparent, % X + 100
    Control, Choose, % CurrentSelection - 1

## 表达式中的运算符

有关运算符的一般信息, 请参阅运算符.

除了下面注明的情况, 其他时候在数学运算中包含的任何空值(空字符串) 或非数字值包括算术运算符中的都 不会 被假定为零. 而是被视为错误, 这将导致那部分表达式的计算结果为空字符串. 例如, 如果变量 X 为空, 那么表达式 X + 1 会返回空值而不是 1.

由于历史原因, 引号包围 形如 `"123"` 的数字字符串直接用于表达式时, 总是视为做非零的(不过如果是用变量来保存, 或者是函数的返回值则不是这样). 这种非零的属性还会被连接符改变, 所以形如 `"0x" n` 的表达式同样会产生一个非零值(即使 n 包含有效的十六进制值, 拼接后也会被视为非零的字符串值). 如果要避开这个问题, 可以把它保存到变量中或者用函数处理一次, 比如用 Round() 处理后的返回值总是纯数字类型. 实际运用中, 脚本应该避免用双引号包围原义的数字, 因为将来的版本中可能会改变.
(译者注: 即 尽量避免 类似: `if ("1" < 2)` 这种形式书写表达式, 虽然目前这样做是合法的, 除非你真的是把这个数字当做文本来处理).

### 表达式运算符(按优先级降序排列)

运算符 | 描述
--- | ---
%Var% | 如果表达式中的变量包围在百分号中(例如 %Var%), 不管此变量 包含 什么内容都会被假定为另一个变量的名称或部分名称(如果不存在这样的变量, 那么 %Var% 会被解析为空字符串). 这种方法常用来引用伪数组元素, 例如:
    Var := MyArray%A_Index% + 100
为了向后兼容, 注明了 "可以使用表达式" 的命令参数把百分号中的孤立名称(例如 %Var%, 但不是 Array%i%) 当作其两边的百分号不存在一样. 通过把引用包围在括号中可以避免这种情况; 例如 `Sleep (%Var%)`. [AHK_L 52+]: 除了普通变量, %Var% 还可以解析为环境变量, 剪贴板或任何的保留/只读的变量. 在修订号 52 之前, 在这些情况中 %Var% 会被当成空字符串.
x.y | [AHK_L 31+]: 对象访问. 从对象 x 中读取或设置值或调用其方法, 此处 y 是个原义值. 请参阅对象语法.
new | [v1.1.00+]: 基于其他对象创建新对象. 例如, `x := new y` 通常等价于 `x := {base: y}`.`new` 后应该跟着变量或 `GlobalClass.NestedClass` 形式的简单类名, 还可以像 `x := new y(z)` 那样加上可选参数(其中 `y` 是变量而非函数名). 更多细节请参阅自定义对象.
++ -- | 前置和后置的自增/自减. 从变量中增加或减去 1(但在 1.0.46 之前的版本中, 这些只能在一行上单独使用; 此行中不存在其他运算符). 运算符可以放在变量名的前面或后面. 如果放在变量名的 前面, 则立即执行自增/减运算并把结果用于下一运算. 例如, `Var := ++X` 让 X 自增后才把它的值赋给 Var. 相反地, 如果运算符放在变量名的 后面, 则在下一运算使用该变量 之后 才对其进行自增/减运算. 例如, `Var := X++` 把 X 的当前值赋给 Var 后才进行自增. 由于向后兼容性, 仅当空变量在一行中单独使用时, 运算符 ++ 和 -- 才把它们视为零; 例如, `y:=1, ++x` 和 `MsgBox % ++x` 当 x 为空时结果都为空. 该运算符用下面的例子来说明,
    x=1
    y=1
    var1:=++x  ; 结果为 var1=2, x=2
    var2:=y++  ; 结果为 var2=1, y=2
    ++z        ; 空变量单独使用
    msgbox % z ; 结果为 z=1
** | 幂. 底数和指数都可以为小数. 如果指数为负数, 即使底数和指数都为整数, 结果也会被格式化为浮点数. 因为 ** 的优先级高于一元负号, 所以 `-2**2` 的计算过程和 `-(2**2)` 一样且得到结果 -4. 因此, 要让负号的优先级高于幂运算, 需要把它们包围在括号中, 例如 `(-2)**2`. 注意: 不支持底数为负数且指数为小数的情况, 例如 `(-2)**0.5`; 它会产生空字符串. 但 `(-2)**2` 和 `(-2)**2.0` 都是支持的. 该运算符用下面的例子来说明:
    msgbox % 2**-2     ; 结果为 0.250000
    msgbox % 2**(-2)   ; 结果为 0.250000
    msgbox % -2**2     ; 结果为 -4
    msgbox % -(2**2)   ; 结果为 -4
    msgbox % (-2)**2   ; 结果为 4
    msgbox % (-2)**2.0 ; 结果为 4.000000
    msgbox % (-2)**0.5 ; 结果为空
注意: 与数学上的对应项不同, ** 在 AutoHotkey v1 中是左结合的. 例如, `x ** y ** z` 计算为 `(x ** y) ** z`.
- ! ~ & * | 一元负号(-): 尽管它和减运算符使用相同的符号, 但一元负号仅应用于单项或子表达式, 如此例中的两次演示: `-(3 / -x)`. 相关提示, 表达式中的任何一元正号(+) 都会被忽略. 逻辑非(!): 如果运算数为空或 0, 那么逻辑非的结果为 1, 这表示 "真". 否则, 结果为 0(假). 例如: `!x or !(y and z)`. 注意: 单词 NOT 和 ! 含义相同, 但 ! 优先级更高. [v1.0.46+]: 允许使用连续的一元运算符, 例如 `!!Var`, 因为它们是按从右到左的顺序计算. 按位非(~): 此运算符对运算数按位取反. 如果运算数为浮点数, 则在计算前把它截取成整数. 如果运算数介于 0 和 4294967295(0xffffffff) 之间, 那么它会被视为 无符号的 32 位值. 否则, 它被视为 有符号的 64 位值. 例如, `~0xf0f` 计算结果为 0xfffff0f0(4294963440). 取址(&): `&MyVar` 获取 MyVar 的内容的内存地址, 此地址一般和 DllCall 结构一起使用. 同时 `&MyVar` 也禁用了此变量中的二进制数的缓存, 如果它经常用于数学或数值比较, 那么这会拖慢其性能. 每当变量的地址改变时会重新启用它的缓存(例如使用 VarSetCapacity()). 解除引用(*): `*Expression` 假定 `Expression` 解析为数字的内存地址; 它会获取在一个介于 0 和 255 之间的数字表示的内存地址中一个字节的内容(地址为 0 时获取的结果也总是 0; 但应该避免使用其他任何无效地址, 因为它可能会让脚本崩溃). 然而, 使用 NumGet() 获取二进制数通常会更好.
* / // | 乘(*): 如果两个输入都为整数, 则结果为整数; 否则结果为浮点数. 真除(/): 与 EnvDiv 不同, 即使两个输入都是整数, 真除的结果也为浮点数. 例如, `3/2` 结果为 1.5 而不是 1, 而 `4/2` 结果为 2.0 而不是 2. 向下舍除(//): 如果两个输入都是整数, 那么双斜杠运算符使用高效的整数除法. 例如, `5//3` 结果为 1 而 `5//-3` 结果为 -1. 如果任何一个输入为浮点数, 则执行浮点除法并把结果往下取整到最近的整数. 例如, `5//3.0` 结果为 1.0 而 `5.0//-3` 结果为 -2.0. 尽管浮点除法的结果为整数, 但它被保存为浮点格式, 以便其他使用者能使用浮点格式. 关于求模运算, 请参阅 mod(). *= 和 /= 运算符是用变量的值乘以或除以另一个值的一种简写形式. 例如, `Var*=2` 和 `Var:=Var*2` 会得到相同的结果(不过前者执行的更好). 除数为零时结果为空(空字符串).
+ - | 加(+) 和 减(-). 相关提示, += 和 -= 运算符是从变量中增加或减少值的一种简写形式. 例如, `Var+=2` 和 `Var:=Var+2` 会得到相同的结果(不过前者执行的更好). 同样地, 使用 Var++, Var--, ++Var 或 --Var 可以让变量增加或减小 1.
<< >> | 按位左移(<<) 和 右移(>>). 用法示例: `Value1 << Value2`. 任何浮点数在计算前会被截取成整数. 左移(<<) 相当于把 Value1 乘以 "2 的 Value2 次幂". 右移(>>) 相当于把 Value1 除以 "2 的 Value2 次幂" 并把结果往下取整到最近的整数; 例如, `-3>>1` 结果为 -2. 译者注: 由于左移操作的运算速度比乘法的运算速度高很多, 因此在处理数据的乘法运算的时, 采用位移运算可以获得较快的速度(对 2 的乘法运算转换为位移运算, 可提高程序的运行效率). 实例过程演示: 例 5 << 2(左移 2 位, 空出的位置上填 0, 最高位溢出则舍弃), 0000 0101(十进制 5) → 0001 0100(十进制 20). 右移与之相反, 对应除法(对 2 的整除运算).
& ^ | | 按位与(&), 按位异或(^) 和 按位或(|). 这三个运算符中, & 优先级最高, 而 | 优先级最低. 任何浮点数在计算前会被截取成整数. 译者注: 按位与(&) 运算规则(二进制): 0&0=0; 0&1=0; 1&0=0; 1&1=1; 3&5=1(两位同时为 "1", 结果才为 "1", 否则为 0) 典型应用: 1. 清零特定位; 2. 取某数中指定位; 例子, 判断奇偶数 N&1; 只保留低八位 N&0xFF(255 以下的数字 & 0xFF 都得到原值). 按位异或(^) 运算规则(二进制): 0^0=0; 0^1=1; 1^0=1; 1^1=0; 3^5=6(如果两个相应位为 "异"(值不同), 则该位结果为 1, 否则为 0) 典型应用: 1. 使特定位翻转; 2. 保留原值 N^0; 按位或(|) 运算规则(二进制): 0|0=0; 0|1=1; 1|0=1; 1|1=1; 3|5=7(参加运算的两个对象只要有一个为 1, 其值为 1) 典型应用: 1. 设定一个数据指定位的值为 1. 例, 设数据的低八位都为 1, N|0xFF
. | 连接. 句点运算符用于把两个项目组合成单个字符串(在句点的两边至少必须有一个空格). 省略句点也可以达到相同的目的(除非表达式中有不明确的关系, 例如 `x -y`, 或在右边的项目含有前导的 ++ 或 -- 运算符). 省略句点时, 合并的两个项目间应该至少有一个空格. 示例(表达式方法): `Var := "The color is " . FoundColor` 示例(传统方法): `Var = The color is %FoundColor%` 还可以用来连接子表达式. 例如: `Var := "The net price is " . Price * (1 - Discount/100)`. 以句点(或其他任何运算符) 开始的行会自动附加到前一行的末尾.
~= | [AHK_L 31+]: 这是 RegExMatch() 的简写形式. 例如, `"abc123" ~= "\d"` 会设置 ErrorLevel 为 0 并返回数字 4(首个数字的位置). 在 [v1.1.03] 之前, 此运算符和 等号 (=) 或 (:=) 运算符优先级相同, 但并未在文档中说明. 译者注, ~= 的优先级低于 not(!), 也就是说会先取反再匹配. 下面是一个很深的坑, 请测试下面这个错误的例子:
    str := "d"
    if (! str ~= "abc"){     	;~ 必须用括号包围才能获得预期的效果 if ! (str ~= "abc")
      Msgbox 无法匹配字母 %str%   	;~ 不会进入这里
    } else {
      Msgbox 可以匹配字母 %str%	;~ 出乎意料的结果
    }
再来测试, not(!) 与 := 相比优先级更低, 这是一个结果可以预料的例子:
    if (!str := "a"){ 	;~ 效果同 if ! (str := "a")
      Msgbox 不正常: %str% 为 false
    }else{
      Msgbox 正常: %str% 为 true	;~ 预期的效果
    }
> < >= <= | 大于(>), 小于(<), 大于或等于(>=) 和 小于或等于(<=). 如果两个输入都是数字或数字字符串, 则将它们进行数字比较; 否则将按字母顺序对它们进行比较. 仅当 StringCaseSense 打开时, 比较才区分大小写. 另请参阅: Sort 注意: 在 AutoHotkey v1 中, 直接在表达式中使用的带引号字符串(或与带引号的字符串连接的结果) 始终不被认为是数字.
= == <> != | Equal (=), 区分大小写的等于(==) 和 不等于(<> 或 !=). 如果两个输入都是数字或数字字符串时, 则会对其进行数字比较; 否则按字母顺序进行比较. 运算符 != 和 <> 在功能上是完全相同的. 运算符 == 的行为与 = 完全相同, 除了其中一个输入不是数字时, == 总是区分大小写, 而 = 总是不区分大小写(不区分大小写的方法取决于 StringCaseSense). 与之相比, <> 和 != 都遵循 StringCaseSense. 注意: 在 AutoHotkey v1 中, 直接在表达式中使用的带引号字符串(或与带引号的字符串连接的结果) 始终不被认为是数字. 过时的: 不推荐在新脚本中使用 <> 运算符. 请使用 != 运算符代替.
NOT | 逻辑非. 除了优先级较低外, 其他的与 ! 运算符相同. 例如, `not (x = 3 or y = 3)` 等同于 `!(x = 3 or y = 3)`.
AND && | 这两个运算符都是 逻辑与. 例如: `x > 3 and x < 10`. 要提高性能, 则要应用求值优化. 此外, 以 AND/OR/&&/||(或其他任何运算符) 开始的行会自动附加到前一行的末尾.
OR || | 这两个运算符都是 逻辑或. 例如: `x <= 3 or x >= 10`. 要提高性能, 则要应用求值优化.
?: | 三元运算符 [v1.0.46+]. 此运算符是 if-else 语句的简写形式. 它计算左侧的条件来决定两个分支中哪个作为最终结果. 例如, `var := x>y ? 2 : 3`, 当 x 大于 y 时保存 2 到 Var; 否则保存 3. 为了提高性能, 只计算决定性的分支(请参阅求值优化).
:= += -= *= /= //= .= |= &= ^= >>= <<= | 赋值. 对变量的内容进行运算, 然后把结果保存到同一个变量中(但在 1.0.46 之前的版本中, 这些运算符只能在一行中最左边使用, 且仅支持前五个运算符). 最简单的赋值运算符为冒号等号(:=), 它把表达式的结果保存到变量中. 关于其他运算符的功能说明, 请参阅这个表格中它们的相关条目. 例如, `Var //= 2` 执行向下舍除, 把 Var 除以 2, 然后把结果保存回 Var. 同样地, `Var .= "abc"` 为 `Var := Var . "abc"` 的一种简写形式. 与其他大多数运算符不同, 赋值运算是从右往左执行的. 因此, `Var1 := Var2 := 0` 这个语句中首先把 0 赋值给 Var2, 然后把 Var2 赋值给 Var1. 如果使用赋值运算的结果作为其他某些运算符的输入, 那么输入的值是变量自身. 例如, 如果变量 Var 新增值后大于 50, 那么表达式 `(Var+=2) > 50` 结果为真. 这样还允许赋值被作为 ByRef 传递或获取它的地址, 例如: `&(x:="abc")`. 需要避免语法错误或提供更直观的操作时, 会自动提升赋值运算符的优先级. 例如: `not x:=y` 等价于 `not (x:=y)`. 同样地, `++Var := X` 等价于 `++(Var := X)`; 而 `Z>0 ? X:=2 : Y:=2` 等价于 `Z>0 ? (X:=2) : (Y:=2)`. 由向后兼容引起的已知限制(可能会在未来的版本中解决): 1) 当 /= 为表达式中最左边的运算符并且它不是多语句表达式的一部分时, 而且输入都不是浮点数时, 它会执行向下舍除(在其他所有情况中, /= 会执行真除); 2) 仅当 += 和 -= 为一行中最左边的运算符时, 它们才支持日期/时间的计算; 3) 运算符 +=, -= 和 *= 仅在空变量在一行单独使用时才把空变量视为零; 例如, `y:=1, x+=1` 和 `MsgBox % x-=3` 当 x 为空时都得到空的结果.
, | 逗号(多语句) [v1.0.46+]. 逗号可以用来在单行中书写多个子表达式. 最常用于把多个赋值或函数调用聚集在一起. 例如: `x:=1, y+=2, ++index, MyFunc()`. 这样的语句按从左到右的顺序执行. 注意: 以逗号(或其他任何运算符) 开始的行会自动附加到前一行的末尾. 另请参阅: 逗号的性能. [v1.0.46.01+]: 当逗号后紧跟着变量和等号时, 则这个等号会被自动当成赋值(:=). 例如, 后面所有的都是赋值: `x:=1, y=2, a=b=c`. 新脚本不应该依赖于这种行为, 因为它可能会改变. 该规则只适用于无格式的变量而不是双重引用, 所以下面的内容只有一个赋值: `x:=1, %y%=2`

下面列出的子表达式改变计算的优先级/顺序:

表达式 | 描述
--- | ---
(expression) | 括号中包含的任何子表达式. 例如, `(3 + 2) * 2` 强制 `3 + 2` 首先计算.
mod() round() abs() | 函数调用. 函数名后面必须紧跟一个左圆括号, 没有任何空格或制表符插入其间. 相关详细信息, 查看函数. 内置数学函数在这里.
%func%() | 请参阅动态调用函数.
func.() | 弃用的: 不推荐使用这个语法. 而应该用 `%func%()`(对于函数名称和对象) 或 `func.Call()`(对于函数对象) 替代. [AHK_L 48+]: 试图调用对象 func 的命名的空方法. 按照约定, 这是对象的 "默认" 方法. 如果 func 不是对象, 则调用默认基对象. [v1.0.95+]: 如果 func 为函数名, 则调用这个命名的函数.
Fn(Params*) | [AHK_L 60+]: 可变参数函数. Params(参数) 是一个包含数组(对象) 的参数值.
x[y] [a, b, c] | [AHK_L 31+]: 成员访问. 得到或设置值或是对象 x 调用方法, 当 y 是一个参数列表时(特别是数组引索或键) 或返回方法名的表达式. [v1.0.97+]: 数组标识符. 如果左方括号前面没有值(或者一个产生值的子表达式), 它被理解为一个数组的开始. 例如, `[a, b, c]` 等同于 `Array(a, b, c)`(a, b 和 c 是变量). 查看数组语法和对象语法以获取更多细节.
{a: b, c: d} | [v1.0.97+]: 对象标识符. 创建一个对象或关联数组. 例如, `x := {a: b}` 等同于 `x := Object("a", b)` 或者 `x := Object(), x.a := b`. 查看关联数组以获取更多细节.

性能: [v1.0.48+]: 使用逗号运算符常常比分开写单独的表达式速度更快, 尤其是把一个变量的值赋给另一个变量时(例如: `x:=y, a:=b`). 当越多的表达式联合成单个表达式时, 性能会持续得到提升; 例如, 把五个或十个简单的表达式联合成单个表达式速度可能提升 35%.

## 内置变量

下面的变量被内置到程序中, 可以被任何脚本引用.

有关一般信息, 请参阅内置变量.

### 目录

- 特殊字符: A_Space, A_Tab
- 脚本属性: 命令行参数, A_WorkingDir, A_ScriptDir, A_ScriptName, (...更多...)
- 日期和时间: A_YYYY, A_MM, A_DD, A_Hour, A_Min, A_Sec, (...更多...)
- 脚本设置: A_IsSuspended, A_BatchLines,A_ListLines, A_TitleMatchMode, (...更多...)
- 用户空闲时间: A_TimeIdle, A_TimeIdlePhysical, A_TimeIdleKeyboard, A_TimeIdleMouse
- GUI 窗口和菜单栏: A_Gui, A_GuiControl, A_GuiEvent, A_EventInfo, (...更多...)
- 热键, 热字串和自定义菜单项: A_ThisHotkey, A_EndChar, A_ThisMenuItem, (...更多...)
- 操作系统和用户信息: A_OSVersion, A_ScreenWidth, A_ScreenHeight, (...更多...)
- 杂项: A_Cursor, A_CaretX, A_CaretY, Clipboard, ClipboardAll, ErrorLevel, (...更多...)
- 循环: A_Index, (...更多...)

### 特殊字符

变量 | 描述
--- | ---
A_Space | 此变量包含单个空格字符. 请参阅 AutoTrim 了解详情.
A_Tab | 此变量包含单个 tab 字符. 请参阅 AutoTrim 了解详情.

### 脚本属性

变量 | 描述
--- | ---
1, 2, 3 等 | 每当启动带命令行参数的脚本时, 会自动创建这些变量. 可以像普通变量一样修改和引用它们(例如: %1%), 但不能在表达式中直接引用. 变量 %0% 包含了命令行参数的数目(如果没有则为 0). 需了解详情请参阅命令行参数.
A_Args [v1.1.27+] | 一个包含命令行参数的数组. 有关详细信息, 请参阅向脚本传递命令行参数.
A_WorkingDir | 脚本当前工作目录, 这是脚本访问文件的默认路径. 除非是根目录, 否则路径末尾不包含反斜杠. 两个示例: C:\ 和 C:\My Documents. 使用 SetWorkingDir 可以改变当前工作目录.
A_ScriptDir | 当前脚本所在目录的绝对路径. 不包含最后的反斜杠(根目录同样如此).
A_ScriptName | 当前脚本的文件名称, 不含路径, 例如 MyScript.ahk. 如果脚本是编译的或嵌入的, 这就是当前可执行文件的名称.
A_ScriptFullPath | 当前脚本的完整路径, 例如 C:\My Documents\My Script.ahk 如果脚本是编译的或嵌入的, 这就是当前可执行文件的完整路径.
A_ScriptHwnd [v1.1.01+] | 脚本的隐藏主窗口的唯一 ID(HWND/句柄).
A_LineNumber | 当前脚本中正在执行的行所在的行号(或其 #Include 文件的行号). 这个行号与 ListLines 显示的一致; 它可以用在报告错误的时候, 例如: `MsgBox Could not write to log file (line number %A_LineNumber%)`. 由于已编译脚本已经把它所有的 #Include 文件合并成一个大脚本, 所以它的行号可能与它在未编译模式运行时不一样.
A_LineFile | A_LineNumber 所属文件的完整路径和名称. 如果脚本是从外部文件加载的, 这等同于 A_ScriptFullPath, 除非该行属于脚本的 #Include 文件之一. 如果脚本是基于一个 .bin 文件编译的, 这就是当前可执行文件的完整路径和名称, 等同于 A_ScriptFullPath. [v1.1.34+]: 如果脚本是嵌入的, A_LineFile 包含一个星号(*) 后面是资源名称; 例如 *#1
A_ThisFunc [v1.0.46.16+] | 当前正在执行的自定义函数的名称(没有则为空); 例如: MyFunction. 另请参阅: IsFunc()
A_ThisLabel [v1.0.46.16+] | 当前正在执行的标签(子程序) 的名称(没有则为空); 例如: MyLabel. 每当脚本执行 Gosub/Return 或 Goto 时会更新此变量的值. 执行自动调用的标签时也会更新此变量的值, 例如计时器, GUI 线程, 菜单项, 热键, 热字串, OnClipboardChange 标签和 OnExit 标签. 不过, 当执行从前面的语句 "进入" 一个标签时不会更新 A_ThisLabel 的值, 即此时它还是保持原来的值. 另请参阅: A_ThisHotkey 和 IsLabel()
A_AhkVersion | 在 [1.0.22] 之前的版本, 此变量为空. 否则, 它包含了运行当前脚本的 AutoHotkey 主程序的版本号, 例如 1.0.22. 在已编译脚本中, 它包含了原来编译时使用的主程序的版本号. 格式化的版本号使得脚本可以使用 > 或 >= 来检查 A_AhkVersion 是否大于某个最小的版本号, 例如: `if A_AhkVersion >= 1.0.25.07`.
A_AhkPath | 对于非编译的或嵌入的脚本: 实际运行当前脚本的 EXE 文件的完整路径和名称. 例如: C:\Program Files\AutoHotkey\AutoHotkey.exe 对于基于 .bin 文件的编译脚本, 该值是通过从注册表中读取安装目录并附加 "\AutoHotkey.exe" 来确定的. 如果没有安装 AutoHotkey, 该值为空. 等同于下面的例子:
    RegRead InstallDir, HKLM\SOFTWARE\AutoHotkey, InstallDir
    AhkPath := ErrorLevel ? "" : InstallDir "\AutoHotkey.exe"
[v1.1.34+]: 对于基于 .exe 文件的编译脚本, A_AhkPath 包含编译脚本的完整路径. 这可以与 /script 结合使用来执行外部脚本. 如果要找到已安装的 AutoHotkey 副本, 请按上面所示读取注册表.
A_IsUnicode | 当字符串为 Unicode(16 位) 时值为 1, 字符串为 ANSI(8 位) 时为空字符串(这会被视为 false). 字符串的格式取决于用来运行当前脚本的 AutoHotkey.exe, 如果为已编译脚本, 则取决于用来编译它的主程序. 对于 [v1.1.06] 之前的 ANSI 可执行文件, A_IsUnicode 没有定义; 也就是说, 脚本可以给它赋值, 并且尝试读取它可能会触发 UseUnsetGlobal 警告. 在以后的版本中, 它始终是定义的并且是只读的.
A_IsCompiled | 如果当前运行的脚本为已编译的 EXE 时, 此变量值为 1, 否则为空字符串(这会被视为 false). 对于 [v1.1.06] 之前的未编译脚本, A_IsCompiled 没有定义; 也就是说, 脚本可以给它赋值, 并且尝试读取它可能会触发 UseUnsetGlobal 警告. 在以后的版本中, 它始终是定义的并且是只读的.
A_ExitReason | 最近一次要求脚本终止的原因. 除非脚本含有 OnExit 子程序并且此子程序当前正在运行或被退出尝试至少调用过一次, 否则此变量为空. 请参阅 OnExit 了解详情.

### 日期和时间

变量 | 描述
--- | ---
A_YYYY | 4 位数表示的当前年份(例如 2004). 与 A_Year 含义相同. 注意: 要获取符合您区域设置和语言的格式化时间或日期, 请使用 `FormatTime, OutputVar`(时间和长日期) 或 `FormatTime, OutputVar,, LongDate`(获取长格式日期).
A_MM | 2 位数表示的当前月份(01-12). 与 A_Mon 含义相同.
A_DD | 2 位数表示的当前月份的日期(01-31). 与 A_MDay 含义相同.
A_MMMM | 使用当前用户语言表示的当前月份的全称, 例如 July
A_MMM | 使用当前用户语言表示的当前月份的简称, 例如 Jul
A_DDDD | 使用当前用户语言表示的当前星期几的全称, 例如 Sunday
A_DDD | 使用当前用户语言表示的当前星期几的简称, 例如 Sun
A_WDay | 1 位数表示的当前星期经过的天数(1-7). 在所有区域设置中 1 都表示星期天.
A_YDay | 当前年份中经过的天数(1-366). 不会使用零对变量的值进行填充, 例如会获取到 9, 而不是 009. 要对变量的值进行零填充, 请使用: `FormatTime, OutputVar, , YDay0`.
A_YWeek | 符合 ISO 8601 标准的当前的年份和周数(例如 200453). 要分离年份和周数, 请使用 `Year := SubStr(A_YWeek, 1, 4)` 和 `Week := SubStr(A_YWeek, -1)`. A_YWeek 的准确定义为: 如果含有 1 月 1 日的星期有四天以上在新年里, 则它被认为是新年的第一个星期. 否则, 它为前一年的最后一个星期, 而下一星期为新年的第一星期.
A_Hour | 在 24 小时制(例如, 17 表示 5pm) 中 2 位数表示的当前小时数(00-23). 要获取带 AM/PM 提示的 12 小时制的时间, 请参照此例: `FormatTime, OutputVar, , h:mm:ss tt`
A_Min | 2 位数表示的当前分钟数(00-59).
A_Sec | 2 位数表示的当前秒数(00-59).
A_MSec | 3 位数表示的当前毫秒数(000-999). 要移除前导零, 请参照此例: `Milliseconds := A_MSec + 0`.
A_Now | YYYYMMDDHH24MISS 格式的当前本地时间. 注意: 使用 EnvAdd 和 EnvSub 可以对日期和时间进行计算. 此外, 使用 FormatTime 可以根据您的区域设置或选项来格式化日期和/或时间.
A_NowUTC | YYYYMMDDHH24MISS 格式的当前的协调世界时(UTC). UTC 本质上和格林威治标准时间(GMT) 一致.
A_TickCount | 计算机启动后经过的毫秒数, 最多为 49.7 天. 通过把 A_TickCount 保存到变量中, 经过一段时间后从最近的 A_TickCount 值中减去那个变量, 可以计算出所经过的时间. 例如:
    StartTime := A_TickCount
    Sleep, 1000
    ElapsedTime := A_TickCount - StartTime
    MsgBox, %ElapsedTime% milliseconds have elapsed.
如果您需要比 A_TickCount 的 10 ms 更高的精确度, 请使用 QueryPerformanceCounter()(高精度计时器).

### 脚本设置

变量 | 描述
--- | ---
A_IsSuspended | 当脚本挂起时值为 1, 否则为 0.
A_IsPaused [v1.0.48+] | 当紧随当前线程的线程被暂停时值为 1. 否则为 0.
A_IsCritical [v1.0.48+] | 当前线程的 Critical 设置关闭时值为 0. 否则它包含大于零的整数, 即 Critical 使用的消息检查频率. 因为 `Critical 0` 关闭了当前线程的关键性, 所以 Critical 的当前状态可以这样来保存和恢复: `Old_IsCritical := A_IsCritical`, 后来执行 `Critical %Old_IsCritical%`.
A_BatchLines | (同义于 A_NumBatchLines) 由 SetBatchLines 设置的当前值. 例如: 200 或 10 ms(取决于格式).
A_ListLines [v1.1.28+] | ListLines 激活时值为 1. 否则为 0.
A_TitleMatchMode | 由 SetTitleMatchMode 设置的当前模式: 1, 2, 3 或 RegEx.
A_TitleMatchModeSpeed | 由 SetTitleMatchMode 设置的当前匹配速度(fast 或 slow).
A_DetectHiddenWindows | 由 DetectHiddenWindows 设置的当前模式(On 或 Off).
A_DetectHiddenText | 由 DetectHiddenText 设置的当前模式(On 或 Off).
A_AutoTrim | 由 AutoTrim 设置的当前模式(On 或 Off).
A_StringCaseSense | 由 StringCaseSense 设置的当前模式(On, Off 或 Locale).
A_FileEncoding | [AHK_L 46+]: 包含了多个命令使用的默认编码; 请参阅 FileEncoding.
A_FormatInteger | 由 SetFormat 设置的当前整数格式(H 或 D). [AHK_L 42+]: 此变量还可能为小写字母 h.
A_FormatFloat | 由 SetFormat 设置的当前浮点数格式.
A_SendMode | [v1.1.23+]: 由 SendMode 设置的当前模式字符串(可能的值为: Event, Input, Play 或 InputThenPlay).
A_SendLevel | [v1.1.23+]: 当前 SendLevel 的设置(可能的值为: 0 到 100 之间的整数, 包括 0 和 100).
A_StoreCapsLockMode | [v1.1.23+]: 由 SetStoreCapsLockMode 设置的当前模式字符串(可能的值为: On 或 Off).
A_KeyDelay A_KeyDuration | 由 SetKeyDelay 设置的当前延迟(总是十进制数, 不是十六进制). A_KeyDuration 依赖 [v1.1.23+] .
A_KeyDelayPlay A_KeyDurationPlay | 表示由 SetKeyDelay 设置 SendPlay 模式的延迟或持续时间(总是十进制数, 不是十六进制). 依赖 [v1.1.23+].
A_WinDelay | 由 SetWinDelay 设置的当前延迟(总是十进制数, 不是十六进制).
A_ControlDelay | 由 SetControlDelay 设置的当前延迟(总是十进制数, 不是十六进制).
A_MouseDelay A_MouseDelayPlay | 由 SetMouseDelay 设置的当前延迟(总是十进制数, 不是十六进制). A_MouseDelay 表示传统的 SendEvent 模式, 而 A_MouseDelayPlay 则表示 SendPlay. A_MouseDelayPlay 依赖 [v1.1.23+].
A_DefaultMouseSpeed | 由 SetDefaultMouseSpeed 设置的当前速度(总是十进制数, 不是十六进制).
A_CoordModeToolTip A_CoordModePixel A_CoordModeMouse A_CoordModeCaret A_CoordModeMenu | [v1.1.23+]: CoordMode 的当前设置值的字符串. (可能的值为: Window, Client 或 Screen)
A_RegView | [v1.1.08+]: 由 SetRegView 设置的当前注册表视图.
A_IconHidden | 托盘图标当前隐藏时值为 1, 否则为 0. 此图标可以使用 #NoTrayIcon 或 Menu 命令进行隐藏.
A_IconTip | 如果使用 `Menu, Tray, Tip` 为托盘图标指定了自定义的工具提示时, 变量的值为这个提示的文本, 否则为空.
A_IconFile | 如果使用 `Menu, tray, icon` 指定了自定义的托盘图标时, 变量的值为图标文件的完整路径和名称, 否则为空.
A_IconNumber | 当 A_IconFile 为空时此变量为空. 否则, 它的值为 A_IconFile 中的图标编号(通常为 1).

### 用户空闲时间

变量 | 描述
--- | ---
A_TimeIdle | 从系统最后一次接收到键盘, 鼠标或其他输入后所经过的毫秒数. 这可以用来判断用户是否离开. 用户的物理输入和由 任何 程序或脚本生成的模拟输入(例如 Send 或 MouseMove 命令) 会让此变量重置为零. 由于此变量的值趋向于以 10 的增量增加, 所以不应该判断它是否等于另一个值. 相反, 应该检查此变量是否大于或小于另一个值. 例如: `IfGreater, A_TimeIdle, 600000, MsgBox, The last keyboard or mouse activity was at least 10 minutes ago`.
A_TimeIdlePhysical | 与上面类似, 但在安装了相应的钩子(键盘或鼠标) 后会忽略模拟的键击和/或鼠标点击; 即此变量仅反应物理事件. (这样避免了由于模拟键击和鼠标点击而误以为用户存在.) 如果两种钩子都没有安装, 则此变量等同于 A_TimeIdle. 如果仅安装了一种钩子, 那么仅此类型的物理输入才会对 A_TimeIdlePhysical 起作用(另一种/未安装钩子的输入, 包括物理的和模拟的, 都会被忽略).
A_TimeIdleKeyboard [v1.1.28+] | 如果安装了键盘钩子, 这是自系统上次接收物理键盘输入以来所经过的毫秒数. 否则, 这个变量就等于 A_TimeIdle.
A_TimeIdleMouse [v1.1.28+] | 如果安装了鼠标钩子, 这是自系统上次收到物理鼠标输入以来所经过的毫秒数. 否则, 这个变量就等于 A_TimeIdle.

### GUI 窗口和菜单栏

变量 | 描述
--- | ---
A_DefaultGui [v1.1.23+] | 当前线程的 GUI 名称或序号.
A_DefaultListView [v1.1.23+] | ListView 控件的变量名或句柄, 这取决与使用了何种 ListView 函数. 如果默认 GUI 中没有 ListView 控件, 此变量为空.
A_DefaultTreeView [v1.1.23+] | TreeView 控件的变量名或句柄, 这取决与使用了何种 TreeView 函数. 如果默认 GUI 中没有 TreeView 控件, 此变量为空.
A_Gui | 启动了当前线程的 GUI 的名称或编号. 除非当前线程是由 Gui 控件, 菜单项或 Gui 事件(例如 GuiClose/GuiEscape) 启动的, 否则此变量为空.
A_GuiControl | 启动当前线程的 GUI 控件的关联变量名. 如果那个控件没有关联变量, 则 A_GuiControl 包含此控件的文本/标题中前 63 个字符(这常用来避免给每个按钮分配变量名). 出现后面这些情况时 A_GuiControl 为空: 1) A_Gui 为空; 2) GUI 菜单项或事件(例如 GuiClose/GuiEscape) 启动了当前线程; 3) 那个控件没有关联变量, 也没有标题; 或 4) 最初启动当前线程的控件已经不存在(可能由于 Gui Destroy 的原因).
A_GuiWidth A_GuiHeight | 在 GuiSize 子程序中引用时, 它们分别包含了 GUI 窗口的宽度和高度. 它们对应于窗口的工作区, 这是窗口中不包括标题栏, 菜单栏和边框的区域. [v1.1.11+]: 这些值会受 DPI 缩放的影响.
A_GuiX A_GuiY | 它们包含了 GuiContextMenu 和 GuiDropFiles 事件中的 X 和 Y 坐标. 这里的坐标相对于窗口的左上角. [v1.1.11+]: 这些值会受 DPI 缩放的影响.
A_GuiEvent 或 A_GuiControlEvent | 启动当前线程的事件类型. 如果当前线程不是由 GUI 动作启动的, 则此变量为空. 否则, 它为下列字符串的其中一个: Normal: 此事件是由左键单击和键击(`↑`, `→`, `↓`, `←`, `Tab`, `Space`, 带下划线的快捷键等) 触发的. 此变量的值还可以用于菜单项和特殊的 Gui 事件, 例如 GuiClose 和 GuiEscape. DoubleClick: 此事件是由双击触发的. 注意: 双击中的首次点击仍会引起 Normal 事件首先被接收到. 换句话说, 双击时子程序会运行两次: 一次在首次点击时, 再次是在第二次点击时. RightClick: 仅出现在 GuiContextMenu, ListViews 和 TreeViews. 上下文相关值: 要了解详情请参阅 GuiContextMenu, GuiDropFiles, Slider, MonthCal, ListView 和 TreeView.
A_EventInfo | 包含下列事件的额外信息: OnClipboardChange 标签 鼠标滚轮热键(WheelDown/Up/Left/Right) OnMessage() RegisterCallback() Regular Expression Callouts GUI 事件, 即 GuiContextMenu, GuiDropFiles, ListBox, ListView, TreeView 和 StatusBar. 如果一个事件没有额外的信息, 那么 A_EventInfo 的值为 0.

注意: 与类似 A_ThisHotkey 这样的变量不同, 每个线程会为 A_Gui, A_GuiControl, A_GuiX/Y, A_GuiEvent 和 A_EventInfo 保存它自己本身的值. 因此, 如果一个线程被另一个中断, 在这个线程恢复时它仍将看到这些变量的原来/正确的值.

### 热键, 热字串和自定义菜单项

变量 | 描述
--- | ---
A_ThisMenuItem | 最近选择的自定义菜单项的名称(没有则为空).
A_ThisMenu | A_ThisMenuItem 所在菜单的名称.
A_ThisMenuItemPos | 表示 A_ThisMenuItem 在 A_ThisMenu 当前 位置的编号. 菜单中首个项目为 1, 第二项为 2, 依此类推. 菜单分隔线也计算在内. 如果 A_ThisMenuItem 为空或已不存在于 A_ThisMenu 中, 则此变量为空. 如果 A_ThisMenu 已不存在, 则此变量也为空.
A_ThisHotkey | 最近执行的热键或非自动替换热字串的按键名称(如果没有则为空), 例如 #z. 如果当前线程被其他热键中断, 那么此变量的值会变化, 所以如果之后需要在子程序中使用原来的值, 则必须马上把它复制到另一个变量中. 首次创建热键时(通过 Hotkey 命令或脚本中的双冒号标签), 其键名及其修饰符的顺序成为此热键的固定名称, 由热键的所有变体共享. 当第一次创建热字符串时, 用于创建它的确切文本将成为热字符串的永久名称. 另请参阅: A_ThisLabel
A_PriorHotkey | 除了保存前一次热键的名称外, 其他的与上面相同. 如果没有它会为空.
A_PriorKey | [v1.1.01+]: 在最近按键按下或按键释放前最后按下的按键名称, 如果在按键历史中没有适用的按键按下则为空. 不包括由 AutoHotkey 脚本生成的所有输入. 要使用此变量, 首先必须安装键盘钩子或鼠标钩子同时启用按键历史.
A_TimeSinceThisHotkey | 从 A_ThisHotkey 按下后到现在经过的毫秒数. 如果 A_ThisHotkey 为空, 则此变量的值为 -1.
A_TimeSincePriorHotkey | 从 A_PriorHotkey 按下后到现在经过的毫秒数. 如果 A_PriorHotkey 为空, 则此变量的值为 -1.
A_EndChar | 用户最近按下的触发了非自动替换热字串的终止符. 如果不需要终止符(由于使用了 * 选项), 那么此变量将为空.

### 操作系统和用户信息

变量 | 描述
--- | ---
ComSpec [v1.0.43.08+] A_ComSpec [v1.1.28+] | 此变量的值与系统环境变量 ComSpec 一样. 常与 Run/RunWait 一起使用. 例如:
    C:\Windows\system32\cmd.exe
A_Temp [v1.0.43.09+] | 存放临时文件的文件夹的完整路径和名称. 它的值从下列的其中一个位置获取(按顺序): 1) 环境变量 TMP, TEMP 或 USERPROFILE; 2) Windows 目录. 例如:
    C:\Users\<UserName>\AppData\Local\Temp
A_OSType | 正在运行的操作系统类型. 由于 AutoHotkey 1.1 仅支持基于 NT 的操作系统, 所以此变量总是为 WIN32_NT. 旧版本的 AutoHotkey 运行在 Windows 95/98/ME 时会返回 WIN32_WINDOWS.
A_OSVersion | 下列字符串中的一个(如果存在): WIN_7 [需要 AHK_L 42+], WIN_8 [需要 v1.1.08+], WIN_8.1 [需要 v1.1.15+], WIN_VISTA, WIN_2003, WIN_XP, WIN_2000. 在 AutoHotKey 的可执行文件或编译后的脚本属性里应用兼容性设置会让操作系统报告不同的版本号, 该版本号由 A_OSVersion 反映. [v1.1.20+]: 如果系统版本没有被识别成上述版本, 会返回一个 "major.minor.build" 形式的字符串. 例如, `10.0.14393` 为 Windows 10 build 14393, 也称为 1607 版.
    ; 这个示例已过时了, 里面的这些操作系统都不再受支持.
    if A_OSVersion in WIN_NT4,WIN_95,WIN_98,WIN_ME  ; 注: 逗号两边没有空格.
    {
        MsgBox This script requires Windows 2000/XP or later.
        ExitApp
    }
A_Is64bitOS | [v1.1.08+]: 当操作系统为 64 位则值为 1(真), 为 32 位则为 0(假).
A_PtrSize | [AHK_L 42+]: 包含指针的大小值, 单位为字节. 值为 4(32 位) 或 8(64 位), 取决于运行当前脚本的执行程序的类型.
A_Language | 当前系统的默认语言, 值为这些 4 位数字编码的其中一个.
A_ComputerName | 在网络上看到的计算机名称.
A_UserName | 运行当前脚本的用户的登录名.
A_WinDir | Windows 目录. 例如: `C:\Windows`
A_ProgramFiles 或 ProgramFiles | Program Files 目录(例如 `C:\Program Files` 或者 `C:\Program Files (x86)`). 一般来说和环境变量 ProgramFiles 一样. 在 64 位系统(非 32 位系统) 上适用: 如果可执行文件(EXE) 以 32 位脚本运行的时候, A_ProgramFiles 返回路径为 "Program Files (x86)" 目录. 对于 32 位的进程, ProgramW6432 环境变量指向 64 位 Program Files 目录. 在 Windows 7 和更高版本上, 对于 64 位的进程也是这样设置的. 而 ProgramFiles(x86) 环境变量指向 32 位 Program Files 目录. [1.0.43.08+]: 前缀 A_ 可以省略, 这样有助于自然过渡到 #NoEnv.
A_AppData [v1.0.43.09+] | 当前用户的应用程序数据文件夹的完整路径和名称. 例如:
    C:\Users\<UserName>\Application Data
A_AppDataCommon [v1.0.43.09+] | 所有用户的应用程序数据文件夹的完整路径和名称. 例如:
    C:\ProgramData
A_Desktop | 当前用户的桌面文件夹的完整路径和名称. 例如:
    C:\Users\<UserName>\Desktop
A_DesktopCommon | 所有用户的桌面文件夹的完整路径和名称. 例如:
    C:\Users\Public\Desktop
A_StartMenu | 当前用户的开始菜单文件夹的完整路径和名称. 例如:
    C:\Users\<UserName>\AppData\Roaming\Microsoft\Windows\Start Menu
A_StartMenuCommon | 所有用户的开始菜单文件夹的完整路径和名称. 例如:
    C:\ProgramData\Microsoft\Windows\Start Menu
A_Programs | 当前用户的开始菜单中程序文件夹的完整路径和名称. 例如:
    C:\Users\<UserName>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
A_ProgramsCommon | 所有用户的开始菜单中程序文件夹的完整路径和名称. 例如:
    C:\ProgramData\Microsoft\Windows\Start Menu\Programs
A_Startup | 当前用户的开始菜单中启动文件夹的完整路径和名称. 例如:
    C:\Users\<UserName>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
A_StartupCommon | 所有用户的开始菜单中启动文件夹的完整路径和名称. 例如:
    C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
A_MyDocuments | 当前用户 "我的文档" 文件夹的完整路径和名称. 与大多数类似变量不同, 当此文件夹为驱动器的根目录时, 此变量的值不包含最后的反斜杠(例如, 它的值是 `M:` 而不是 `M:\`). 例如:
    C:\Users\<UserName>\Documents
A_IsAdmin | 如果当前用户有管理员权限, 则此变量的值为 1. 否则为 0. 要使脚本以管理员权限重新启动(或显示提示向用户请求管理员权限), 请使用 Run *RunAs. 但是请注意, 以管理员权限运行脚本会导致脚本启动的所有程序也以管理员权限运行. 对于可能的替代方案, 请参阅常见问题(FAQ).
A_ScreenWidth A_ScreenHeight | 主监视器的宽度和高度, 单位为像素(例如 1024 和 768). 要获取多显示器系统中其他显示器的尺寸, 请使用 SysGet. 要获取整个桌面(即使它横跨多个显示器) 的宽度和高度, 请使用下面的例子:
    SysGet, VirtualWidth, 78
    SysGet, VirtualHeight, 79
此外, 使用 SysGet 可以获取显示器的工作区域, 它比显示器的整个区域小, 因为它不包括任务栏和其他注册的桌面工具栏.
A_ScreenDPI [v1.1.11+] | 在屏幕宽度上每逻辑英寸的像素数. 在多显示器的系统中, 这个值对于所有的显示器都是一样的. 在大多数系统中该值为 96; 它取决于系统文本大小(DPI) 设置. 另请参阅 Gui -DPIScale.
A_IPAddress1 到 4 | 计算机中前 4 个网卡的 IP 地址.

### 杂项

变量 | 描述
--- | ---
A_Cursor | 当前显示的鼠标光标类型. 其值为下列单词的其中一个: AppStarting(程序启动, 后台运行--箭头+等待), Arrow(箭头, 正常选择--标准光标), Cross(十字, 精确选择), Help(帮助, 帮助选择--箭头+问号), IBeam(工字光标, 文本选择--输入), Icon, No(No, 不可用--圆圈加反斜杠), Size, SizeAll(所有尺寸, 移动--四向箭头), SizeNESW(东南和西北尺寸, 沿对角线调整 2--双箭头指向东南和西北), SizeNS(南北尺寸, 垂直调整--双箭头指向南北), SizeNWSE(西北和东南尺寸, 沿对角线调整 1--双箭头指向西北和东南), SizeWE(东西尺寸, 水平调整--双箭头指向东西), UpArrow(向上箭头, 候选--指向上的箭头), Wait(等待, 忙--沙漏或圆圈), Unknown(未知). 与 size 指针类型一起的首字母表示方向, 例如 NESW = NorthEast(东北)+SouthWest(西南). 手型指针(点击和抓取) 属于 Unknown 类别.
A_CaretX A_CaretY | 当前光标(文本插入点) 的 X 和 Y 坐标. 如果没有使用 CoordMode 使得坐标相对于整个屏幕, 默认坐标相对于活动窗口. 如果没有活动窗口或无法确定文本插入点的位置, 则这两个变量为空. 下面这个脚本可以让您在四处移动文本插入点时, 查看显示在自动更新工具提示上的当前位置. 注意在某些窗口(例如某些版本的 MS Word) 会不管文本插入点的实际位置如何都报告同样的位置.
    #Persistent
    SetTimer, WatchCaret, 100
    return
    WatchCaret:
      ToolTip, X%A_CaretX% Y%A_CaretY%, A_CaretX, A_CaretY - 20
    return
Clipboard | 可用于获取或设置操作系统剪贴板的内容. 有关详情, 请参阅剪贴板.
ClipboardAll | 剪贴板中的完整内容(包含格式和文本). 有关详情, 请参阅 ClipboardAll.
ErrorLevel | 这个变量由一些命令设置, 用于指示其成功或失败. 有关详情, 请参阅 ErrorLevel.
A_LastError | 操作系统 GetLastError() 函数或最近 COM 对象调用返回的结果. 要了解详情, 请参阅 DllCall() 和 Run/RunWait.
True False | 包含 1 和 0. 它们可以用来使脚本更具可读性. 有关详情, 请参阅布尔值.

### Loop

变量 | 描述
--- | ---
A_Index | 当前循环重复的次数(64 位整数). 例如, 当脚本首次执行此循环体时, 此变量的值为 1. 要了解详情请参阅 Loop 或 While 循环.
A_LoopFileName 等 | 此变量和其他相关变量仅在文件循环中有效.
A_LoopRegName 等 | 此变量和其他相关变量仅在注册表循环中有效.
A_LoopReadLine | 请参阅文件读取循环.
A_LoopField | 请参阅解析循环.

## 变量的容量和占用内存

- 每个变量最多可以含有 64 MB 的文本(使用 #MaxMem 可以突破这个限制).
- 当赋值给变量比当前更长的内容时, 会自动分配额外的系统内存给这个变量.
- 通过赋值为空可以释放大变量占用的内存, 例如 `Var := ""`.
- 脚本可以创建的变量数量没有限制. 程序设计用来支持至少几百万的变量而不会出现明显的性能下降.
- 接受数值输入的命令, 函数和表达式通常可以支持 15 位的浮点数精度. 对于整数, 可以支持 64 位有符号整数, 其范围从 -9223372036854775808(-0x8000000000000000) 到 9223372036854775807(0x7FFFFFFFFFFFFFFF). 此范围外的任何整数或数字字符串不受支持, 并且当作为数字使用时可能产生错误的结果. 与之相比, 整数的算数运算结果超出此范围时会产生溢出(例如 0x7FFFFFFFFFFFFFFF + 1 = -0x8000000000000000).

dftg