# 程序的使用

AutoHotkey 程序本身不做任何事情; 它需要一个脚本来告诉它该做什么. 脚本只是一个简单的以 `.ahk` 作为扩展名的文本文件, 其中包含了程序的指令, 像配置文件, 但功能更强大. 一个脚本可以执行一个动作然后退出, 但大多数脚本定义了一些热键, 当热键按下时, 热键后面跟着的一个或多个动作将会执行.

    #z::Run https://autohotkey.com  ; Win+Z

    ^!n::  ; Ctrl+Alt+N
    if WinExist("Untitled - Notepad")
        WinActivate
    else
        Run Notepad
    return

提示: 如果您的浏览器支持, 当你将鼠标悬停在代码块上面时, 您可以通过点击代码块右上角的按钮来下载任何代码块(如上面的代码块) 作为脚本文件.

## 目录

- 创建脚本
- 编辑脚本
- 运行脚本
- 托盘图标
- 主窗口
- 嵌入脚本
- 命令行用法
- AutoHotkey.exe 的可移植性
- 安装选项
  - 以 UI 访问权限运行

## 创建脚本

有几种常见的方法来创建脚本文件:

- 在记事本(或你选择的文本编辑器) 中, 使用 `.ahk` 文件扩展名保存文件. 在某些系统上, 您可能需要将文件名用引号括起来, 以确保编辑器不会添加其他扩展名(例如 .txt).

如果文件包含非 ASCII 字符, 请确保将文件保存为带有 BOM(字节顺序标记) 的 UTF-8. 有关详情, 请参阅常见问题(FAQ).

- 在资源管理器, 希望保存脚本的文件夹中的空白区域右键单击, 然后选择 新建 和 AutoHotkey Script. 然后, 您可以输入脚本的名称(注意, 如果 `.ahk` 扩展名可见时, 请不要删掉它).

有关如何编写脚本的详细信息, 请参阅脚本语言.

## 编辑脚本

要打开脚本进行编辑, 请右键单击脚本文件, 然后选择 Edit Script(编辑脚本). 如果脚本已经在运行, 您可以使用 Edit(编辑) 命令或右键单击脚本的托盘图标并选择 Edit This Script(编辑此脚本). 默认情况下, 这将打开记事本, 但可以通过写入注册表来更换编辑器, 如例子所示. 当然, 您可以先打开文本编辑器, 然后像打开其他任何文本文件一样打开脚本.

编辑脚本保存后, 您必须运行或 reload(重新加载) 脚本以使更改生效. 正在运行的脚本通常可以通过其托盘菜单重新加载.

## 运行脚本

安装了 AutoHotkey 后, 有几种运行脚本的方法:

- 双击资源管理器中的脚本文件(或脚本文件的快捷方式).
- 在命令行中调用 AutoHotkey.exe, 并将该脚本的文件名(路径) 作为命令行参数.
- 创建 the default script(默认脚本) 后, 通过 "开始" 菜单中的快捷方式启动 AutoHotkey 以运行它.
- 如果 AutoHotkey 固定在 Windows 7 或更高版本系统的任务栏或 "开始" 菜单上, 则可以通过程序跳转列表打开最近的或已固定的脚本.

大多数脚本只有在运行时才会起作用. 使用托盘菜单或 ExitApp 命令退出脚本. 当 Windows 关闭时, 脚本也被迫退出. 要将脚本配置为在用户登录后自动启动, 最简单的方法是在 Startup(启动) 文件夹中放置脚本文件的快捷方式.

脚本也可以编译; 即与 AutoHotkey 二进制文件结合在一起, 形成一个独立的可执行(.exe) 文件.

## 托盘图标

默认情况下, 每个脚本都将自己的图标添加到任务栏通知区域(通常称为托盘).

托盘图标通常如下所示(但脚本 paused(暂停) 或 suspended(挂起) 时颜色或字母会更改):

右键单击托盘图标以显示托盘菜单, 默认情况下具有以下选项:

- Open - (打开) - 打开脚本的主窗口.
- Help - (帮助) - 打开 AutoHotkey 离线帮助文件.
- Window Spy - (窗口监视器) - 显示关于窗口的各种信息.
- Reload This Script - (重载这个脚本) - 请参阅 Reload.
- Edit This Script - (编辑这个脚本) - 请参阅 Edit.
- Suspend Hotkeys - (挂起热键) - 挂起或取消挂起热键.
- Pause Script - (暂停脚本) - 暂停或取消暂停脚本.
- Exit - (退出) - 退出脚本.

默认情况下, 双击托盘图标显示脚本的主窗口.

Menu 命令可以用来自定义托盘图标和菜单.

#NoTrayIcon 指令可用于隐藏托盘图标.

## 主窗口

脚本的主窗口通常是隐藏的, 但可以通过托盘图标或下面列出的命令之一显示, 以获得对调试脚本有用的信息. View 菜单下的项目控制主窗口显示的内容:

- Lines most recently executed - (最近执行的行) - 请参阅 ListLines.
- Variables and their contents - (变量和它们的内容) - 请参阅 ListVars.
- Hotkeys and their methods - (热键和它们的方法) - 请参阅 ListHotkeys.
- Key history and script info - (按键历史和脚本信息) - 请参阅 KeyHistory.

已知问题: 当脚本显示消息框或其他对话框时, 菜单项下的键盘快捷键不起作用.

内置变量 A_ScriptHwnd 包含脚本主窗口的唯一 ID(HWND).

使用 WinClose(甚至从另一个脚本或其他程序) 关闭这个窗口会导致脚本退出, 但大多数其他方法只是隐藏窗口并保持脚本运行.

最小化主窗口会使其自动隐藏. 这样做是为了防止将所有拥有的窗口(如 GUI 窗口或某些对话框窗口) 自动最小化, 但也有隐藏主窗口任务栏按钮的效果. 要让主窗口正常最小化, 可以用 OnMessage 覆盖默认的处理方式. 例如:

    ; 这样可以防止主窗口在最小化时隐藏:
    OnMessage(0x0112, Func("PreventAutoMinimize")) ; WM_SYSCOMMAND = 0x0112
    OnMessage(0x0005, Func("PreventAutoMinimize")) ; WM_SIZE = 0x0005
    ; 这样可以防止拥有的 GUI 窗口(但不包括对话框) 自动最小化:
    OnMessage(0x0018, Func("PreventAutoMinimize"))

    PreventAutoMinimize(wParam, lParam, uMsg, hwnd) {
        if (uMsg = 0x0112 && wParam = 0xF020 && hwnd = A_ScriptHwnd) { ; SC_MINIMIZE = 0xF020
            WinMinimize
            return 0 ; 防止主窗口隐藏.
        }
        if (uMsg = 0x0005 && wParam = 1 && hwnd = A_ScriptHwnd) ; SIZE_MINIMIZED = 1
            return 0 ; 防止主窗口隐藏.
        if (uMsg = 0x0018 && lParam = 1) ; SW_PARENTCLOSING = 1
            return 0 ; 防止最小化拥有的窗口.
    }

### 主窗口标题

脚本主窗口的标题会被 #SingleInstance 和 Reload 机制用来识别同一脚本的其他实例. 改变标题可以防止脚本被这样识别出来. 默认的标题取决于脚本的加载方式:

加载于 | 标题表达式 | 示例
--- | --- | ---
.ahk 文件 | `A_ScriptFullPath " - AutoHotkey v" A_AhkVersion` | E:\My Script.ahk - AutoHotkey v1.1.33.09
主要资源(编译的脚本) | `A_ScriptFullPath` | E:\My Script.exe
任何其他资源 | `A_ScriptFullPath " - " A_LineFile` | E:\My AutoHotkey.exe - *BUILTIN-TOOL.AHK

下面的代码说明了如何由脚本本身决定默认的标题(但实际的标题可以用 WinGetTitle 来检索):

    title := A_ScriptFullPath
    if !A_IsCompiled
        title .= " - AutoHotkey v" A_AhkVersion
    ; 为了获得正确的结果, 必须由被执行的资源来计算,
    ; 而不是一个 #include(除非这个 #include 是由 Ahk2Exe 合并到脚本中的):
    else if SubStr(A_LineFile, 1, 1) = "*" && A_LineFile != "*#1"
        title .= " - " A_LineFile

## 嵌入脚本[v1.1.34+]

脚本可以被嵌入到一个标准的 AutoHotkey .exe 文件中, 方法是将它们作为 Win32(RCDATA) 资源来添加. 嵌入的脚本可以在命令行中指定, 也可以使用 #Include 在资源名称后跟一个星号(*). 对于一个整数 ID, 资源名称必须是一个哈希符号(#), 后面是一个十进制数字.

程序可以自动从以下资源加载脚本代码, 如果存在于文件中:

ID | Spec | Usage
--- | --- | ---
1 | *#1 | 这是一种从 .exe 文件创建编译脚本的方法. 该脚本是自动执行的, 大多数命令行开关会被传递给脚本, 而不是由程序解释. 外部脚本和可选的嵌入式脚本可以通过使用 /script 开关来执行.
2 | *#2 | 如果存在, 该脚本会在程序加载的任何脚本之前自动 "included", 以及在 /include 指定的任何文件之前.

当主脚本的源是一个嵌入式资源时, 程序以 "编译脚本" 模式运行, 但 A_AhkPath 总是包含当前可执行文件的路径(与 A_ScriptFullPath 相同). 对于 *#1 以外的资源, 资源指定符会包含在主窗口的标题中, 以支持 #SingleInstance 和 Reload.

当从嵌入资源的代码中引用时, A_LineFile 包含一个星号(*) 后跟资源名称.

## 命令行用法

有关命令行用法, 请参阅向脚本传递命令行参数, 其中包括影响程序行为的命令行开关列表.

## AutoHotkey.exe 的可移植性

运行任何的 .ahk 脚本所需要的只是 AutoHotkey.exe 文件(译者注: 当脚本引用了其他 ahk 文件或库文件时, 这些引用的文件也是需要的, 否则程序会报错).

[AHK_L 51+]: 重命名 AutoHotkey.exe 会同时改变它默认运行的脚本, 这是在没有安装 AutoHotkey 的计算机上运行脚本的一种可选方法. 例如, 在没有指定文件名时, 执行 MyScript.exe 会自动运行 MyScript.ahk, 但也能运行其他脚本.

## 安装选项

要静默安装 AutoHotkey 到默认目录(这与手动安装时显示的目录相同), 需要向安装程序传递 /S 参数. 例如:

    AutoHotkey110800_Install.exe /S

使用参数 /D 可以指定默认目录外的其他目录作为安装目录(如果没有使用 /S, 那么这样可以改变在安装程序中显示的默认目录). 例如:

    AutoHotkey110800_Install.exe /S /D=C:\Program Files\AutoHotkey

Version(版本): 如果之前已经安装了 AutoHotkey, 则安装程序会自动检测 AutoHotkey.exe 的构建并设置为默认构建. 否则, 根据操作系统是否为 64 位设置默认构建为 Unicode 32 位或 Unicode 64 位. 要覆盖 AutoHotkey.exe 的默认构建设置, 请使用下列的其中一个开关:

- `/A32` 或 `/ANSI`: ANSI 32 位.
- `/U64` 或 `/x64`: Unicode 64 位(仅在 64 位系统中有效).
- `/U32`: Unicode 32 位.

例如, 下面的命令会静默安装并设置 ANSI 32 位为默认的构建:

    AutoHotkey110800_Install.exe /S /A32

Uninstall(卸载): 要静默卸载 AutoHotkey, 需要向 Installer.ahk 传递 `/Uninstall` 参数. 例如:

    "C:\Program Files\AutoHotkey\AutoHotkey.exe" "C:\Program Files\AutoHotkey\Installer.ahk" /Uninstall

对于 1.1.08.00 以前的 AutoHotkey 版本, 请使用 `uninst.exe /S`. 例如:

    "C:\Program Files\AutoHotkey\uninst.exe" /S

注意: Installer.ahk 需要管理员权限才能正常运行.

Extract(提取解压): 以后版本的安装包在右下角包含了用来提取安装文件而不进行安装的链接. 如果存在这个功能, 则可以在命令行中使用 `/E` 开关来调用它. 例如:

    AutoHotkey110903_Install.exe /D=F:\AutoHotkey /E

Reload(重启脚本) [v1.1.19.02+]: 在静默安装/卸载模式中, 运行中的脚本可能会自动关闭. 通过传递 `/R` 参数, 可自动用之前运行时对应的 EXE 版本重启脚本, 无需其他命令行参数. 安装器将尝试通过 资源管理器(Explorer) 启动脚本, 所以当 用户账户控制(UAC) 开启的情况下, 脚本不会以管理员权限运行.

任务栏按钮 [v1.1.08+]: 在 Windows 7 及更高版本, 默认情况下, 任务栏的多个按钮将会组合为一个或一组. 而 分隔任务栏按钮 选项可关闭这个特性, 其原理是通过注册每一个 AutoHotkey 可执行文件为宿主程序(IsHostApp).

[v1.1.24.02+]: 从命令行安装时, 设置 `/IsHostApp` 或 `/IsHostApp=1` 开启这个选项, 而设置 `/IsHostApp=0` 则是关闭.

### 以 UI Access 运行 [v1.1.24.02+]

安装器界面上有个 "增加 'Run with UI Access'(以 UI Access 运行) 到上下文菜单" 选项. 这个上下文菜单选项提供解决通常会遇到的 UAC 的相关问题, 它可让脚本自动管理程序权限, 且无需以管理员权限运行. 安装器实现该功能的方法是:

- 复制 AutoHotkeyA32.exe, AutoHotkeyU32.exe 或 AutoHotkeyU64.exe(当前选择的版本) 为 AutoHotkey*_UIA.exe.
- 在每个 UIA 文件的嵌入式清单(manifest) 中设置 uiAccess 属性.
- 创建名为 "AutoHotkey" 的自签名数字证书, 然后签名每个 UIA 文件.
- 注册上下文菜单选项来运行对应的 exe 文件.

对应安装之前就存在的 UIA 文件, 无论是否开启了 UI Access 选项, 安装器都会自动升级它们.

对于命令行安装方式, 指定 `/uiAccess` 或 `/uiAccess=1` 来开启选项, 设为 `/uiAccess=0` 则是关闭. 如果系统的 UAC(用户账户控制) 为开启的且 UI Access 上下文选项在安装之前已经注册过时, 安装器将默认开启这个选项.

脚本可以以 UI access 方式运行其他的脚本, 只需要简单的 Run 对应的 UIA.exe 文件加上命令行参数即可.

已知限制:

- UIA 只会影响信任区域的文件; 比如 Program Files 的子目录.
- 如果没有注册程序发布者用于签名的数字证书, 那么 UIA.exe 文件不能在其他计算机上运行.
- 由于安全限制, UIA.exe 文件无法通过 CreateProcess 启动. 不过可以用 ShellExecute 替代. 内置的 Run 命令将会自动尝试以这两种方式运行.
- UIA.exe 文件不可修改, 否则无法通过文件的数字签名验证.
- 由于 UIA 程序和其他程序具有不同的 "integrity level(可信级别)", 它们仅可通过其他的 "UIA 程序" 来注册对象. 比如, `ComObjActive("Word.Application")` 将会失败, 因为 Word 并不是一个 UI Access 标记的程序.
- 由于安全限制, 脚本自身的窗口无法自动视为 "无 UIA 程序或脚本".
- 运行使用鼠标钩子的 "非 UIA 脚本" 时(类似简单的出现了 `#InstallMouseHook` 指令), 鼠标热键会在由 UIA 脚本创建的窗口中失效, 即使热键为 "UIA 脚本" 自身定义的. 可行的解决办法是: 确保 "UIA 脚本" 最后一个加载.

更多详情, 请参考 Enable interaction with administrative programs 论坛存档贴

dftg