# v1.0 到 v1.1 的更改

本文档详细介绍了 AutoHotkey v1.0 和 v1.1 之间的变化, 这些变化可能会导致脚本的行为不同, 因此在阅读或更新旧代码时可能需要注意. 另请参阅: v1.1 到 v2.0 的更改.

AutoHotkey 1.1 也称为 "AutoHotkey_L", 而 AutoHotkey 1.0 则表示 "AutoHotkey Basic". AutoHotkey_L 的一些旧版本使用 1.0.* 版本号, 所以为了清晰, 这里的帮助中使用名称而不是版本号来区分 AutoHotkey 的两种分支.

## 目录

高度影响:

- 不再允许的一些语法错误
- FileRead 可能返回损坏的二进制数据
- 变量和函数名中不允许使用 [, ] 或 ?
- DPI 比例缩放对于 GUI 是默认开启的

中度影响:

- Transform 的 Unicode 子命令在 Unicode 版本中不再可用
- 运行 AutoHotkey.ahk 来代替 AutoHotkey.ini
- SetFormat, Integer, H 区分大小写
- A_LastError 会被更多的命令修改
- MsgBox 的逗号智能处理更加一致
- Gui 的选项覆盖额外的样式
- ~颚化符(波浪号) 会影响自定义修饰键的工作方式
- `x & y::` 会使得 `x::` 和 `x up::` 都会在 x 释放时触发

低度影响:

- If var is type 默认忽略系统区域设置
- GroupActivate 设置 ErrorLevel 和 GroupAdd 的 Label 作用的差异
- Run 和 RunWait 解释 Target 的差异
- Control-Z 不会被解释为文件结束
- A_IsCompiled 总是只读的
- DllCall 在更多情况下尝试使用 A 或 W 后缀

## 语法错误

AutoHotkey_L 中不允许某些在 AutoHotkey Basic 中接受的语法错误. 识别出这些错误后, 其中大多数都很容易改正. 有些错误是在加载时检测到的, 必须在脚本运行前予以纠正. 其他的错误只有在脚本运行时满足特定条件时才会出现.

v2.0 版的错误检测一般来说更加稳健, 由于在错误检测和处理之外还有许多用法上的变化, 所以这里不列出 v1.0 版和 v1.1 版在错误检测方面的区别. 有关详情, 请参阅 v1.1 版的文档.

## FileRead

在某些常见情况下, FileRead 会在代码页之间转换文本, 因此可能输出错误的二进制数据. 要在 v2.0 版中避免此问题, 请添加 `RAW` 选项或使用 FileOpen 代替.

## 变量和函数名称

字符 `[`, `]` 和 `?` 被保留在表达式中使用, 所以在变量名中不再合法. 因此, `?`(在三元运算中使用) 不再需要在两边加上空格. 在变量名中使用这些字符的 v1.0 版本的代码在 v1.1 版本中会有新的解释, 因此可能不会被检测出错误.

相关: 对象的运算符, 名称(v1.1 到 v2.0 的更改)

## DPI 缩放

DPI 缩放对于脚本 GUI 是默认开启的, 以确保它们根据系统 DPI 设置缩放. 如果启用, 并且系统 DPI 设置不是 96(100 %), 那么由 Gui 方法/属性接受或返回的位置和尺寸将与其他函数不兼容. 要禁用 DPI 缩放功能, 请使用 `MyGui.Opt("-DPIScale")`.

## Transform

一些 Transform 子命令被修改或不可用:

- `Transform, Unicode` 只在 ANSI 版本的 AutoHotkey 中可用. 要将 Unicode 文本赋值到剪贴板, 请使用常规赋值. 另请参阅: StrPut/StrGet.
- `Transform, HTML` 在 Unicode 版本的 AutoHotkey_L 中支持额外的功能.

`Transform` 本身在 v2.0 中被删除.

## 默认脚本

未指定脚本运行 AutoHotkey_L 时, 默认加载 .ahk 文件而不是 .ini. 这个文件的名称取决于当前执行程序的文件名. 有关详情, 请参阅 Script Filename.

## SetFormat, Integer[Fast], H

使用大写字母 H 时, 十六进制数字中 A-F 也将为大写. AutoHotkey Basic 总是使用小写形式的数字.

SetFormat 本身在 v2.0 中被删除. `Format("0x{:x}", n)` 产生小写字母 a-f, 而 `Format("0x{:X}", n)` 产生大写字母 A-F.

## A_LastError

现在后面的这些命令会设置 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 设置.

## MsgBox

v1.0 和 v1.1 中的 MsgBox 有 "智能逗号处理", 以避免在未加引号的文本中转义逗号. 这种处理方式在两个版本中略有不同, 在阅读 v1.0 版本的代码时, 可能需要考虑到极少数情况. v2.0 完全使用表达式语法, 因此不需要对逗号进行任何特殊处理.

## GUI 的 Owner 选项

对 Gui 应用 +Owner 选项还会移除 WS_CHILD 样式并设置 WS_POPUP 样式. 这样会破坏在设置这些样式 之后 使用 `+Owner` 设置 Gui 的父窗口的脚本.

## 颚化符(~) 和自定义组合键

从 v1.1.14 起, 当一个按键作为修饰符用于自定义组合键时, 颚化符前缀会影响该热键的工作方式.

## 自定义组合键和 Down/Up 热键

除了使用颚化符前缀的情况, 对于自定义修饰键会同时定义按键按下和弹起热键, 它们在该按键释放时都会触发. 例如, `x & y::` 会使得 `x::` 和 `x up::` 都会在 x 释放时触发, 而以前 `x::` 是不会触发的.

## If var is type

`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 中被删除.

## Run / RunWait

AutoHotkey_L 对 Run 和 RunWait 命令解释 Target 参数的方式进行了一些改进. 这样能允许一些以前不工作的情况, 但在一些非常罕见的情况下, 也可能影响到已经在 AutoHotkey Basic 中正常工作的脚本. 新的行为如下:

- 如果 Target 以引号开始, 则到下一个引号之间的所有内容被视为要执行的操作, 一般为可执行文件.
- 否则首个以空格结束并且为一个现有文件或以 .exe, .bat, .com, .cmd 或 .hta 结尾的子字符串被视为操作. 这样就允许 .ahk, .vbs 或 .lnk 等文件类型接受参数, 同时仍然允许运行 "已知" 的可执行文件(例如 wordpad.exe), 而不像以前的版本那样需要绝对路径.

## Control-Z

Loop Read 和 File.ReadLine 不再把字符 `Ctrl`+`Z`(0x1A) 解释为文件结束标记. 任何的 `Ctrl`+`Z`, 即使某一个恰好出现在文件末尾, 都原样加载. FileRead 已经忽略这个字符, 所以不受这个问题的影响.

## A_IsCompiled

如果脚本没有被编译, A_IsCompiled 也会被定义; 它的值在 v1.1 中是 `""`, 在 v2.0 中是 `0`. 以前它是未定义的, 这意味着如果脚本没有被编译, 诸如 `A_IsCompiled := 1` 这样的赋值是有效的. 现在在所有的情况下都被视为一个只读的内置变量.

## DllCall

当给 DllCall 的函数名不能被解析时, AutoHotkey_L 会自动在函数名上附加一个 "A"(ANSI) 或 "W"(Unicode), 而不管指定的是哪个 Dll. 相比之下, AutoHotkey Basic 仅对 User32.dll, Kernel32.dll, ComCtl32.dll 或 Gdi32.dll 中的函数添加 "A" 后缀.

dftg