本文档详细介绍了 AutoHotkey v1.0 和 v1.1 之间的变化, 这些变化可能会导致脚本的行为不同, 因此在阅读或更新旧代码时可能需要注意. 另请参阅: v1.1 到 v2.0 的更改.
AutoHotkey 1.1 也称为 "AutoHotkey_L", 而 AutoHotkey 1.0 则表示 "AutoHotkey Basic". AutoHotkey_L 的一些旧版本使用 1.0.* 版本号, 所以为了清晰, 这里的帮助中使用名称而不是版本号来区分 AutoHotkey 的两种分支.
高度影响:
中度影响:
x & y::
会使得 x::
和 x up::
都会在 x 释放时触发低度影响:
AutoHotkey_L 中不允许某些在 AutoHotkey Basic 中接受的语法错误. 识别出这些错误后, 其中大多数都很容易改正. 有些错误是在加载时检测到的, 必须在脚本运行前予以纠正. 其他的错误只有在脚本运行时满足特定条件时才会出现.
v2.0 版的错误检测一般来说更加稳健, 由于在错误检测和处理之外还有许多用法上的变化, 所以这里不列出 v1.0 版和 v1.1 版在错误检测方面的区别. 有关详情, 请参阅 v1.1 版的文档.
在某些常见情况下, FileRead 会在代码页之间转换文本, 因此可能输出错误的二进制数据. 要在 v2.0 版中避免此问题, 请添加 RAW
选项或使用 FileOpen 代替.
字符 [
, ]
和 ?
被保留在表达式中使用, 所以在变量名中不再合法. 因此, ?
(在三元运算中使用) 不再需要在两边加上空格. 在变量名中使用这些字符的 v1.0 版本的代码在 v1.1 版本中会有新的解释, 因此可能不会被检测出错误.
相关: 对象的运算符, 名称(v1.1 到 v2.0 的更改)
DPI 缩放对于脚本 GUI 是默认开启的, 以确保它们根据系统 DPI 设置缩放. 如果启用, 并且系统 DPI 设置不是 96(100 %), 那么由 Gui 方法/属性接受或返回的位置和尺寸将与其他函数不兼容. 要禁用 DPI 缩放功能, 请使用 MyGui.Opt("-DPIScale")
.
一些 Transform 子命令被修改或不可用:
Transform, Unicode
只在 ANSI 版本的 AutoHotkey 中可用. 要将 Unicode 文本赋值到剪贴板, 请使用常规赋值. 另请参阅: StrPut/StrGet.Transform, HTML
在 Unicode 版本的 AutoHotkey_L 中支持额外的功能.Transform
本身在 v2.0 中被删除.
未指定脚本运行 AutoHotkey_L 时, 默认加载 .ahk 文件而不是 .ini. 这个文件的名称取决于当前执行程序的文件名. 有关详情, 请参阅 Script Filename.
使用大写字母 H 时, 十六进制数字中 A-F 也将为大写. AutoHotkey Basic 总是使用小写形式的数字.
SetFormat 本身在 v2.0 中被删除. Format("0x{:x}", n)
产生小写字母 a-f, 而 Format("0x{:X}", n)
产生大写字母 A-F.
现在后面的这些命令会设置 A_LastError 来辅助调试: FileAppend, FileRead, FileReadLine, FileDelete, FileCopy, FileMove, FileGetAttrib/Time/Size/Version, FileSetAttrib/Time, FileCreateDir, RegRead, RegWrite, RegDelete. 使用这些命令的其中任何一个会覆盖 A_LastError 之前的值.
对于 v2.0, A_LastError 也由 IniRead, IniWrite 和 IniDelete 设置.
v1.0 和 v1.1 中的 MsgBox 有 "智能逗号处理", 以避免在未加引号的文本中转义逗号. 这种处理方式在两个版本中略有不同, 在阅读 v1.0 版本的代码时, 可能需要考虑到极少数情况. v2.0 完全使用表达式语法, 因此不需要对逗号进行任何特殊处理.
对 Gui 应用 +Owner 选项还会移除 WS_CHILD 样式并设置 WS_POPUP 样式. 这样会破坏在设置这些样式 之后 使用 +Owner
设置 Gui 的父窗口的脚本.
从 v1.1.14 起, 当一个按键作为修饰符用于自定义组合键时, 颚化符前缀会影响该热键的工作方式.
除了使用颚化符前缀的情况, 对于自定义修饰键会同时定义按键按下和弹起热键, 它们在该按键释放时都会触发. 例如, x & y::
会使得 x::
和 x up::
都会在 x 释放时触发, 而以前 x::
是不会触发的.
If var is type
在 v1.0 中默认将某些(可能是特有的区域) 非 ASCII 字符识别为字母/小写/大写, 而在 v1.1 中只有在使用 StringCaseSense, Locale
时才会如此. 同样, v2.0 版中的 IsType 函数只有在第二个参数是 "Locale"
时才会将非 ASCII 字符识别为字母.
GroupActivate 只在 v1.1 中设置 ErrorLevel, 而不在 v1.0 或 v2.0 中设置.
GroupAdd 的 Label 参数在 v1.0 和 v1.1 中的表现不同, 但在 v2.0 中被删除.
AutoHotkey_L 对 Run 和 RunWait 命令解释 Target 参数的方式进行了一些改进. 这样能允许一些以前不工作的情况, 但在一些非常罕见的情况下, 也可能影响到已经在 AutoHotkey Basic 中正常工作的脚本. 新的行为如下:
Loop Read 和 File.ReadLine 不再把字符 Ctrl+Z(0x1A) 解释为文件结束标记. 任何的 Ctrl+Z, 即使某一个恰好出现在文件末尾, 都原样加载. FileRead 已经忽略这个字符, 所以不受这个问题的影响.
如果脚本没有被编译, A_IsCompiled 也会被定义; 它的值在 v1.1 中是 ""
, 在 v2.0 中是 0
. 以前它是未定义的, 这意味着如果脚本没有被编译, 诸如 A_IsCompiled := 1
这样的赋值是有效的. 现在在所有的情况下都被视为一个只读的内置变量.
当给 DllCall 的函数名不能被解析时, AutoHotkey_L 会自动在函数名上附加一个 "A"(ANSI) 或 "W"(Unicode), 而不管指定的是哪个 Dll. 相比之下, AutoHotkey Basic 仅对 User32.dll, Kernel32.dll, ComCtl32.dll 或 Gdi32.dll 中的函数添加 "A" 后缀.