AutoHotkey Scripts and Macros

AutoHotKey

脚本

目录

简介

每个脚本都是纯文本文件, 其中包含了可由程序 (AutoHotkey.exe) 执行的文本行. 脚本中还可以包含 热键热字串 或者甚至完全由它们组成. 不过, 在不包含热键和热字串时, 脚本会在启动后从上往下按顺序执行其中的命令.

程序会把脚本逐行加载到内存中, 每行最多可以包含 16,383 个字符. 在加载过程中, 脚本会被 优化 和检查. 将列出所有的语法错误, 更正它们后脚本才能运行.

脚本顶部 (自动执行段)

脚本加载完成后, 它会从顶行开始执行, 直到遇到 Return, Exit, 热键/热字串标签 或脚本的底部(无论最先遇到哪个). 脚本的这个顶端部分被称为 自动执行 段.

如果脚本不是 持续运行的 且不含有 热键, 热字串, OnMessageGUI, 那么它会在自动执行段结束后终止. 否则, 它会以空闲状态继续运行, 从而对例如热键, 热字串, GUI 事件, 自定义菜单项计时器 这些事件进行响应.

每个由 热键, 热字串, 菜单项, GUI 事件计时器 启动的 线程 都以在自动执行段设置的下列属性值作为默认值开始. 如果没有设置, 则使用标准的默认值(与下面每个页面中注明的一样):DetectHiddenWindows, DetectHiddenText, SetTitleMatchMode, SetBatchLines, SendMode, SetKeyDelay, SetMouseDelay, SetWinDelay, SetControlDelay, SetDefaultMouseSpeed, CoordMode, SetStoreCapslockMode, AutoTrim, SetFormat, StringCaseSense, ThreadCritical.

如果自动执行段执行了很长时间才结束 (或永不结束), 上面这些设置的默认值将在 100 毫秒后自动生效. 当自动执行段最终结束 (如果可能) 时, 在自动执行段末尾生效的那些设置才更新为默认值. 因此, 通常最好在包含 热键, 热字串, 计时器自定义菜单项 的脚本顶部设置自己想要的默认值. 还要注意, 每个 线程 会保存它自己的上述设置的集合. 在一个线程中对这些设置的改变不会影响其他 线程.

转义序列

AutoHotkey 中默认的 转义符 为重音符/反引号 (`), 它位于大多数英文键盘的左上角. 使用这个字符而不是反斜线可以与在文件路径的双反斜线以示区分.

由于 AutoHotkey 中的逗号和百分号都具有特殊含义, 因此需要使用 `, 来指定原义的逗号, 使用 `% 来指定原义的百分号. 其中的一个例外是 MsgBox, 它里面的逗号不需要进行转义. 另一个例外是在任意命令最后一个参数中的逗号: 它们不需要进行转义. 请参阅 #EscapeChar 了解转义序列的完整列表.

某些特殊字符也需要使用转义序列的方法生成. 最常见的有 `t(tab), `n(换行)和 `r(回车).

提示: 任何命令中的首个逗号可以省略 (除非首个参数为空或以 := 或 = 开始, 或命令单独处于 延续片段 的顶部). 例如:

MsgBox This is ok.
MsgBox, This is ok too (it has an explicit comma).

在脚本中添加注释

在行首使用分号可以注释当前行脚本. 例如:

; 这整行是注释.

也可以在命令的末尾添加注释, 此时分号左侧必须至少有一个空格或 tab. 例如:

Run Notepad  ; 这是和命令在同一行的注释.

此外, 可以使用 /* 和 */ 符号注释整块代码, 但仅当它们出现在行首时才有效, 例如:

/*
MsgBox, This line is commented out (disabled).
MsgBox, This one too. 
*/

由于脚本运行时会忽略注释, 所以它们不会影响脚本性能或占用内存.

使用 #CommentFlag 可以把默认的注释符 (分号) 改为其他字符或字符串.

把过长的行分割成一系列短行

可以把过长的行分割成一系列较短的行来提高可读性和可维护性. 这样不会降低脚本的执行速度, 因为在脚本启动时这些短行会在内存中合并起来.

方法 #1: 以 "and", "or", ||, &&, 逗号或 句点 开始的行会自动合并到其前一行 (在 v1.0.46+, 除了 ++ 和 -- 外其他所有的 表达式运算符 开头的行也会如此). 在下面的例子中, 第二行会自动附加到首行, 因为它以逗号开始:

FileAppend, This is the text to append.`n   ; 这里可以使用注释.
    , %A_ProgramFiles%\SomeApplication\LogFile.txt  ; 注释.

同样地, 下列几行也会合并成单行, 因为最后两行以 "and" 或 "or" 开始:

if (Color = "Red" or Color = "Green"  or Color = "Blue"   ; 注释.
    or Color = "Black" or Color = "Gray" or Color = "White")   ; 注释.
    and ProductIsAvailableInColor(Product, Color)   ; 注释.

三元运算符 也是个不错的选择:

ProductIsAvailable := (Color = "Red")
    ? false  ; 我们没有任何红色产品, 所以不用那么麻烦去调用函数.
    : ProductIsAvailableInColor(Product, Color)

尽管在上面的例子中缩进不是必须的, 但它可以显示出哪些行属于上一行从而提高代码清晰度. 并且, 可以不必在单词 "AND" 和 "OR" 开始的行加上额外的空格; 程序会自动处理这些. 最后, 可以在上面例子中任意行的末尾或行与行之间添加空行或 注释.

方法 #2: 这种方法用于合并大量的行或不适合方法 #1 处理的行. 此方法对 自动替换热字串 特别有用, 但它也可以用于命令或 表达式中. 例如:

; 示例 #1:
Var =
(
Line 1 of the text.
Line 2 of the text. By default, a linefeed (`n) is present between lines.
)

; 示例 #2:
FileAppend,  ; 此时逗号是不能缺少的.
(
A line of text.
By default, the hard carriage return (Enter) between the previous line and this one will be written to the file as a linefeed (`n).
    By default, the tab to the left of this line will also be written to the file (the same is true for spaces).
By default, variable references such as %Var% are resolved to the variable's contents.
), C:\My File.txt

在上面的例子中, 几行代码被一对圆括号包围起来. 这被称为 延续片段. 注意在底行的闭括号后面跟着 FileAppend 的最后一个参数. 这种做法是可选的; 这样做是为了确保逗号被视为参数分隔符而不是原义的逗号.

通过在延续片段的开括号右侧包含一个或多个下列选项, 可以覆盖它的默认特性. 如果含有多个选项, 那么选项之间使用空格分开. 例如:( LTrim Join| %.

Join: 指定行与行之间连接的方式. 如果省略此选项, 那么除最后一行外的其他行后面都会跟一个换行符 (`n). 如果指定单词 Join 自身, 则行与行之间直接连接而不添加任何字符. 或者在单词 Join 后可以紧跟着多达 15 个字符. 例如,Join`s 会在除最后一行外的每行末尾插入一个空格("`s"表示原义的空格, 这是一个只能被 Join 识别的特殊转义序列). 另一个例子是 Join`r`n, 它会在行与行之间插入 CR+LF. 同样地,Join| 会在行之间插入管道符. 要让延续片段的最后一行也以连接字符串结尾, 需要在它的闭括号上一行添加一个空行.

已知限制: 如果单词Join后面紧跟一个冒号, 那么冒号不能是这一行的最后一个. 因为 (Join: 将被当做一个名为 Join 的标签对待, 所以不支持 (LTrim Join: 这种写法, 而 (Join: C 这种写法没有问题.

LTrim: 删除每行开头的空格和 tab. 主要用来允许延续片段使用缩进. 此外, 通过在一行中指定 #LTrim 自身可以为多个延续片段打开此选项.#LTrim 跟位置有关:会影响它下面的所有延续片段. 使用 #LTrim Off 可以关闭此设置.

RTrim0 (RTrim 后跟着一个零): 关闭自动删除每行末尾的空格和 tab 的设置.

Comments(或 CommentComC) [v1.0.45.03+]:允许在延续片段中使用分号注释(但不支持 /*..*/). 这样的注释 (以及它们左边的空格和 tab) 会在连接时完全被忽略而不是当成原义文本处理. 每个注释可以放在一行的右侧或单独一行.

% (百分号): 把百分号视为原义字符而不是变量引用. 这样就不需要把每个百分号 转义 成原义字符. 在百分号已经为原义的地方不需要使用此选项, 例如 自动替换热字串.

, (逗号): 把逗号作为分隔符而不是原义逗号. 这个非常少用的选项只有在命令的参数之间才需要, 因为在 函数调用 中逗号的类型没有影响. 并且, 此选项只会转换那些真正的分隔参数的逗号. 换句话说, 一旦到了命令的最后一个参数 (或者命令没有参数), 那么会忽略此选项而把后续的逗号当成原义逗号.

` (重音符): 把每个反引号视为原义字符而不是 转义符. 此选项同时也避免了需要分别对逗号和百分号进行明确地转义. 此外, 它还阻止对任何特定的转义序列例如 `r 和 `t 进行转义.

) [v1.1.01+]: 如果一个右括号出现在延续代码的参数中(除了作为 Join 的选项参数), 那么这一行将重新解释为一个表达式, 而不是作为一段延续代码的开始. 这将避免类似 (x.y)[z]() 的表达式需要对左括号进行转义.

备注

当没有指定 重音符 (`) 选项 时, 支持在延续片段中使用 转义序列, 例如 `n (换行) 和 `t (tab).

没有使用 注释选项 时, 不支持在延续片段中使用分号和 /*..*/ 添加注释, 因为它们会被视为原义文本. 不过, 可以在片段的底行和顶行添加注释. 例如:

FileAppend,   ; 注释.
; 注释.
( LTrim Join    ; 注释.
     ; This is not a comment; it is literal. Include the word Comments in the line above to make it a comment.
), C:\File.txt   ; 注释.

由上面可知, 延续片段中的分号不需要进行 转义.

使用延续片段无法生成总长度超过 16,383 字符的行 (如果尝试这么做, 那么程序在启动时会弹出警告). 解决此问题的一种方法是把一系列内容连接到变量中. 例如:

Var =
(
...
)
Var = %Var%`n  ; 通过另一个延续片段添加更多文本到此变量中.
(
...
)
FileAppend, %Var%, C:\My File.txt

因为闭括号表示延续片段的结束, 所以要让某一行以原义的闭括号开头, 需要在其前面加上重音符/反引号:`).

一个延续片段后面可以紧跟着包含另一个延续片段的开括号的一行. 这样使得上面提到的选项可以在创建单行的过程中进行改变.

不支持通过 #Include 的方法把延续片段各部分连接起来.

把脚本转换成 EXE (ahk2exe)

程序中已包含了脚本编译器 (感谢 fincs 提供).

脚本编译完成后, 就成了一个独立的可执行文件;也就是说, 可以在没有安装 AutoHotkey 的机器上运行. 编译过程中会创建一个包含下列文件的可执行文件: AutoHotkey 解释器, 脚本需要加载的任何文件以及通过 FileInstall 命令内嵌的任何文件.

使用 Ahk2Exe 有下列几种方式:

  1. GUI 界面: 运行菜单菜单中的 "Convert .ahk to .exe" 菜单项.
  2. 右键点击: 在资源管理器中, 您可以在任何一个 .ahk 上右键点击并选择 "Compile Script" (只有在安装 AutoHotkey 时选择了脚本编译器时时才可用). 这样创建了与脚本具有相同的主文件名的 EXE 文件, 它会在稍后出现在相同目录中. 注: 这样生成的 EXE 文件会使用与前面的方法 #1 最后一次使用时相同的自定义图标, .bin 文件以及 MPRESS 设置.
  3. 命令行: 编译器可以使用下列参数在命令行中运行:
    Ahk2Exe.exe /in MyScript.ahk [/out MyScript.exe] [/icon MyIcon.ico] [/bin AutoHotkeySC.bin] [/mpress 0or1]
    例如:
    Ahk2Exe.exe /in "MyScript.ahk" /icon "MyIcon.ico"
    用法:
    • 含有空格的参数应该包围在双引号中.
    • 如果省略了 "out" 文件, 则使用脚本的主文件名作为 EXE 的主文件名.

注意:

  • 进行编译通常并不会提升脚本的性能.
  • 截至 v1.1.01, 还不支持密码保护和 /NoDecompile 选项.
  • 命令 #NoTrayIcon 和 "Menu, Tray, ShowMainWindow" 会影响已编译脚本的行为.
  • 使用类似 Resource Hacker (免费软件) 的工具编辑 "AutoHotkeySC.bin" 文件可以给已编译脚本添加自定义版本信息 (和在资源管理器的文件属性对话框中看到的那些). 此文件包含在 AutoHotkey 安装目录的 "Compiler" 子文件夹中. 可以使用 Compile_AHK II 简化这个过程. 截至 v1.1.01, 可以直接编辑已编译脚本而不是 AutoHotkeySC.bin.
  • 还可以使用上面的方法改变所有已编译脚本现有的图标或为它们添加新图标.
  • 如果脚本以编译的形式运行, 则内置变量 A_IsCompiled 的值为 1. 否则为空.
  • 传递参数到 Ahk2Exe 后, 它会在标准输出中写入表示编译过程成功与否的消息. 尽管此消息不会显示在命令提示符中, 但可以通过像重定向到文件的方法 "捕获". [v1.0.43+]
  • 另外, 当编译出错时,Ahk2Exe还能返回退出代码, 它可以指示编译的错误类型. 错误类型更多信息请访问 GitHub (ErrorCodes.md). [v1.1.22.03+]

编译器的源码和新版本可以在 GitHub 找到.

压缩编译脚本

Ahk2Exe 可选用 MPRESS (MATCODE Software出品的一款免费软件) 压缩编译脚本. 如果在AutoHotKey安装目录的"Compiler"子目录存在 mpress.exe , 编译时将自动使用MPRESS来压缩, 除非指定了 /mpress 0 参数或在界面中设置不启用压缩.

官网 (2016年3月该网站已下线): http://www.matcode.com/mpress.htm

镜像 (下载信息): https://autohotkey.com/mpress/

注意: 压缩编译脚本可以保护脚本不被诸如记事本或 PE 编辑器这类的工具随意查看, 但并不能保护脚本源码不被专用的提取工具提取.

向脚本传递命令行参数

脚本支持命令行参数. 格式为:

AutoHotkey.exe [Switches] [Script Filename] [Script Parameters]

对于已编译脚本, 格式为:

CompiledScript.exe [Switches] [Script Parameters]

Switches: 零个或多个下列开关:

开关释义
/f or /force 无条件强制启动, 忽略任何警告对话框. 和 #SingleInstance Off 的效果相同.
/r或/restart 脚本将会执行Reload 命令.
/ErrorStdOut 把阻止脚本运行的语法错误发送到标准输出而不显示在对话框中. 请参阅 #ErrorStdOut 了解详情. 这可以联合 /iLib 来验证脚本而不用运行它.
不支持已编译脚本:
/Debug [AHK_L 11+]: 连接到调试客户端. 想了解更多细节, 请参阅 交互调试.
/CPn [AHK_L 51+]: 覆盖用于读取脚本文件的默认代码页. 想了解更多信息, 请参阅 脚本文件代码页.
/iLib "OutFile"

[v1.0.47+]: AutoHotkey 加载但不运行脚本. 每个脚本会自动 include 函数库, 两行代码会写到 OutFile 里面, 就像下面一样::

#Include LibDir\
#IncludeAgain LibDir\LibFile.ahk

如果输出文件存在会被覆盖. 可以使用 *输出到 stout.

如果脚本语法错误, 那么输出脚本也许就为空. 程序错误代码可以检测这种情况; 如果这里有语法错误, 错误代码就是2. /ErrorStdOut可以用来捕获错误信息.

Script Filename:如果不含 Script Parameters, 那么此参数可以省略. 省略时, 它会运行 (或提示您创建) 下列默认位置的其中一个文件:

AutoHotkey.ahk 的文件名取决于Autohotkey 的文件名. 例如重命名 AutoHotkey.exe 成 MyScript.exe, 它会尝试打开 MyScript.ahk. 如果你运行 AutoHotkeyU32.exe 没有参数则会运行 AutoHotkeyU32.ahk.

备注:在早期版本 revision 51, 程序会在工作目录寻找 AutoHotkey.ini 或者我的文档下的 AutoHotkey.ahk.

[v1.1.17+]: 星号(*)加在文件名上会打开标准输入通道(stdin)的脚本. 例如 ExecScript().

脚本参数: 你想要传递给脚本的参数用空格分隔. 单个参数如果包含空格需要在两端加上". 如果参数本身包含"则需要转义 (\"). 如果参数末尾是\则可能会被转义(例如"C:\My Documents\")会被视为引号(就是说脚本会接收到 C:\My Documents"). 要移除引号, 使用StringReplace, 1, 1, ",, All.

脚本内收的参数变量会是%1%, %2%等等. %0%包含参数个数. 然而在表达式中 1, 2 等会被视为数字而不是变量. 下面的例子展示了传入参数:

if 0 < 3  ; 左边的 non-expression if-statement 始终是变量名.
{
    MsgBox 脚本需要至少 3 个参数, 但实际只接收到 %0% 个.
    ExitApp
}

如果传递给脚本的参数数目不确定 (可能由于用户拖放一组文件到脚本上), 可以使用下面的示例逐个提取这些参数:

Loop, %0%  ; 对每个参数进行循环:
{
    param := %A_Index%  ; 取得名称为 A_Index 的值的变量中的内容.
    MsgBox, 4,, Parameter number %A_Index% is %param%.  Continue?
    IfMsgBox, No
        break
}

如果这些参数是文件名, 那么可以使用下列的例子把它们转换到大小写正确的长名称(与文件系统中存储的一致), 其中包含完整/绝对的路径.

Loop %0%  ; 对每个参数 (或放到脚本上的文件) 进行循环:
{
    GivenPath := %A_Index%  ; 取得名称为 A_Index 变量中的内容.
    Loop %GivenPath%, 1
        LongPath = %A_LoopFileLongPath%
    MsgBox The case-corrected long path name of file`n%GivenPath%`nis:`n%LongPath%
}

已知限制: 如果 NTFS 文件系统中关闭了 8.3 (短) 文件名, 那么拖拉文件到 .ahk 脚本上可能无法正常工作. 一种解决方法是 编译 脚本, 然后拖拉文件到生成的 EXE 文件上.

脚本文件代码页 [AHK_L 51+]

用来加载脚本的代码页决定了脚本中可以使用的字符.

  • 如果文件以 UTF-8 或 UTF-16 (LE) 字节顺序标记开头, 则会忽略 /CPn 开关并为其使用适合的代码页.
  • 如果在命令行中传递了 /CPn 开关, 则使用代码页 n. 想了解有效的数值代码页标识符, 请参阅 MSDN.
  • 在其他所有情况中使用系统默认的 ANSI 代码页.

注意这仅适用于 AutoHotkey 加载脚本的时候, 而不包括脚本自身的文件 I/O. FileEncoding 决定了脚本读取或写入文件时使用的默认编码, 然而 IniReadIniWrite 总是使用 UTF-16 或 ANSI.

由于所有的文本都被转换 (必要时) 为 原生的字符串格式, 所以无效的或不存在于原生代码页中的字符会被替换为占位符: ANSI '?' 或 Unicode '?'. 在 Unicode 版本中, 这种情况只可能在脚本文件编码错误或用于保存和读取脚本的代码页不一致时发生.

可以使用 RegWrite 为资源管理器中运行的脚本设置默认代码页 (例如双击脚本文件时):

; 取消对下面适当的行的注释或让它们都保留注释
;   以重新设置为当前版本的默认代码页.  需要时进行修改:
; codepage = 0        ; 系统默认的 ANSI 代码页
; codepage = 65001    ; UTF-8
; codepage = 1200     ; UTF-16
; codepage = 1252     ; ANSI Latin 1; 西欧 (Windows)
if (codepage != "")
    codepage := " /CP" . codepage
cmd="%A_AhkPath%"%codepage% "`%1" `%*
key=AutoHotkeyScript\Shell\Open\Command
if A_IsAdmin    ; 为所有用户进行设置.
    RegWrite, REG_SZ, HKCR, %key%,, %cmd%
else            ; 仅为当前用户进行设置.
    RegWrite, REG_SZ, HKCU, Software\Classes\%key%,, %cmd%

这里假定已经安装了 AutoHotkey. 如果没有, 则结果可能不理想.

调试脚本

ListVarsPause 等命令可以帮助您调试脚本. 例如, 把下面这两行临时插入精心选择的位置时, 可以在脚本中创建 "断点":

ListVars
Pause

当脚本执行到这两行时, 会显示所有变量当前包含的内容供你检查. 当你准备恢复时, 可以通过 File 或托盘菜单取消暂停. 然后脚本会继续执行, 直到遇到下一个"断点"(如果有).

通常最好把这些 "断点" 插入到活动窗口对当前脚本没有影响的位置, 例如 WinActivate 命令的前一行. 这样当您取消暂停时脚本才可以正确恢复操作.

下列命令也可以用于调试: ListLines, KeyHistoryOutputDebug.

一些常见错误, 例如拼写错误或忘记 "global" 声明时, 可以使用 启用警告 检测到.

交互调试 [AHK_L 11+]

通过受支持的 DBGp 客户端 可以进行交互调试. 一般支持下列操作:

  • 设置和移除断点 - 遇到 断点 时暂停执行.
  • 单步调试代码 - 逐语句, 逐过程或跳出函数和子程序.
  • 检查所有变量或特殊变量.
  • 查看正在运行的子程序和函数的堆栈.

注意在已编译脚本中没有提供此功能.

要启用交互调试, 首先要运行受支持的调试器客户端, 然后使用命令开关 /Debug 运行脚本.

AutoHotkey.exe /Debug[=SERVER:PORT] ...

SERVERPORT 可以省略. 例如, 下面的方式是等同的:

AutoHotkey /Debug "myscript.ahk"
AutoHotkey /Debug=localhost:9000 "myscript.ahk"

[AHK_L 59+]: 要向已经在运行的脚本附加调试器, 请向脚本发送消息, 如下所示:

ScriptPath = ; 设置此变量为脚本的完整路径
DetectHiddenWindows On
ifWinExist %ScriptPath% ahk_class AutoHotkey
    ; 可选参数:
    ;   wParam  = 调试器客户端的 IPv4 地址, 相当于 32 位整数.
    ;   lParam  = 调试器客户端的监听端口.
    PostMessage DllCall("RegisterWindowMessage", "str", "AHK_ATTACH_DEBUGGER")

当调试器连接后, 通过发送 "detach" DBGp 命令可以在不终止脚本的情况下分离调试器.

AutoHotkey.exe 的可移植性

运行任何的 .ahk 脚本的所有需要只是 AutoHotkey.exe 文件.

[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

重启脚本 [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 论坛存档贴.

脚本展示

请参阅 此页面 了解一些有用的脚本.