AutoHotkey 本身并不会做任何事情,你需要编写一个脚本来告诉它怎么做。所谓脚本就是一个以 .ahk
为后缀的纯文本文件,里面包含了多个程序指令,就像配置文件一样,但是功能更加强大。一个脚本可以只是简单地执行一个动作后就退出,也可以定义大量的[热键](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/Hotkeys.htm),每个热键执行一个或多个操作。
#z::Run https://www.autohotkey.com ; Win+Z
^!n:: ; Ctrl+Alt+N
if WinExist("Untitled - Notepad")
WinActivate
else
Run Notepad
return
提示: 如果你的浏览器支持的话,你可以将鼠标悬浮在帮助文件中代码块的右上角,将其直接下载为脚本文件。
文章目录
创建脚本
有多种方式来创建脚本文件:
-
在记事本或其他文本编辑器中,将文件另存为.ahk后缀文件。 有些系统上你需要将文件名用双引号包裹,以避免编辑器为脚本再添加另一个后缀名(如.txt)。
请务必将文件保存成“UTF-8 with BOM”编码格式,以免文件在使用非ASCII 字符时显示为乱码。详情请见[FAQ](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/FAQ.htm#nonascii)。
-
在资源管理器中打开想要保存脚本的文件夹,在空白处右击,选择 新建 /AutoHotkey 脚本。然后输入脚本名称就可以了,注意不要误删了后缀名
.ahk
。
如何编写脚本请参考[Scripting Language](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/Language.htm) 。
编辑脚本
如果要编辑脚本,在脚本上右击,选择编辑脚本命令。如果脚本正在运行,可以使用 [Edit](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/commands/Edit.htm) 命令或在脚本[托盘图标](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/Program.htm#tray-icon) 上右击并选择 Edit This Script 命令。 默认情况下将会打开记事本,也可以通过[此处](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/commands/Edit.htm#Example)的注册表项来修改默认的编辑器。当然,你可以先打开文本编辑器,然后像其他文本文件一样打开脚本。
编辑脚本后,必须运行或[reload](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/commands/Reload.htm) 脚本,使更改生效。正在运行的脚本可以使用[托盘菜单](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/Program.htm#tray-icon)来重新载入。
运行脚本
安装 AutoHotkey 后,有多种方式来运行脚本:
- 在资源管理器中双击脚本文件(或者是脚本的快捷方式)。
- 在命令行调用 AutoHotkey.exe,然后将脚本文件名称作为 [命令行参数](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/Scripts.htm#cmd)传入。
- 创建 [默认脚本](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/Scripts.htm#defaultfile)后,通过开始菜单中的快捷方式启动 AutoHotkey来运行脚本。
- 对于Windows 7 或更新版操作系统,如果 AutoHotkey 被固定到任务栏或开始菜单中,可以通过程序的跳转列表来访问最近文件或固定脚本。
大部分脚本只有在运行时才起作用。使用[托盘菜单](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/Program.htm#tray-icon) 或 [ExitApp](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/commands/ExitApp.htm) 命令退出脚本。脚本在Windows关闭时会强制退出。如果希望将脚本配置为开机启动,最简单的办法就是将脚本快捷方式放到 [Startup](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/Variables.htm#Startup) 启动文件夹中。
脚本还可以被 [编译](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/Scripts.htm#ahk2exe),即与 AutoHotkey 二进制文件结合,生成一个自包含的可执行(.exe)文件。
托盘图标
默认情况下,每个脚本都会在任务通知栏(通常称为托盘)添加一个图标。
托盘图标通常指示看起来是一个绿色H图标(但是颜色和字母在脚本处于[paused](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/commands/Pause.htm) 或 [suspended](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/commands/Suspend.htm)状态时会发生变化): [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pVgsjYXn-1649116432110)(%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E7%A8%8B%E5%BA%8F.assets/image-20220404155356697.png)]
右击托盘图标显示托盘菜单,默认有以下命令:
- Open - 打开脚本的 [主窗口](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/Program.htm#main-window)。
- Help - 打开 AutoHotkey 离线帮助文档。
- Window Spy - 检测并显示窗口的各种信息。
- Reload This Script - 参考[Reload](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/commands/Reload.htm)。
- Edit This Script - 参考[Edit](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/commands/Edit.htm)。
- Suspend Hotkeys - [挂起](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/commands/Suspend.htm) 或取消挂起热键。
- Pause Script - [暂停](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/commands/Pause.htm) 或取消暂停脚本。
- Exit - 退出脚本。
默认情况下,双击托盘图标会打开脚本的 [主窗口](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/Program.htm#main-window)。
使用[Menu](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/commands/Menu.htm) 命令可以自定义托盘图标和菜单。
使用[#NoTrayIcon](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/commands/_NoTrayIcon.htm) 指令可以隐藏托盘图标。
主窗口
脚本的主窗口通常是隐藏的,可使用 [托盘图标](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/Program.htm#tray-icon) 或下面列出的某个命令来获取调试脚本的有用信息。View 菜单下的各项用于控制主窗口显示的内容:
- Lines most recently executed (最近执行的代码)——参考 [ListLines](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/commands/ListLines.htm).
- Variables and their contents (变量及其内容)——参考 [ListVars](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/commands/ListVars.htm).
- Hotkeys and their methods (热键及其方法)——参考 [ListHotkeys](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/commands/ListHotkeys.htm).
- Key history and script info (按键历史及脚本信息)——参考 [KeyHistory](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/commands/KeyHistory.htm).
已知问题: 当脚本显示了 [消息框](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/commands/MsgBox.htm) 或其他对话框时,菜单项的键盘快捷键会失效。
内置变量 [A_ScriptHwnd](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/Variables.htm#ScriptHwnd) 包含的是脚本主窗口的唯一 ID(HWND)。
使用 [WinClose](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/commands/WinClose.htm) (即使是从另一个脚本调用)关闭窗口会让脚本退出,但是大部分其他脚本仅仅是将窗口隐藏,脚本会继续运行。
最小化主窗口会使其自动隐藏。这样做是为了避免 any owned windows(如 GUI 窗口或某些对话框窗口)被自动最小化,另外也起到了隐藏主窗口任务栏按钮的作用。如果需要让主窗口正常最小化,可以重写 [OnMessage](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/commands/OnMessage.htm)的默认处理函数。例如:
; This prevents the main window from hiding on minimize:
OnMessage(0x0112, Func("PreventAutoMinimize")) ; WM_SYSCOMMAND = 0x0112
OnMessage(0x0005, Func("PreventAutoMinimize")) ; WM_SIZE = 0x0005
; This prevents owned GUI windows (but not dialogs) from automatically minimizing:
OnMessage(0x0018, Func("PreventAutoMinimize"))
PreventAutoMinimize(wParam, lParam, uMsg, hwnd) {
if (uMsg = 0x0112 && wParam = 0xF020 && hwnd = A_ScriptHwnd) { ; SC_MINIMIZE = 0xF020
WinMinimize
return 0 ; Prevent main window from hiding.
}
if (uMsg = 0x0005 && wParam = 1 && hwnd = A_ScriptHwnd) ; SIZE_MINIMIZED = 1
return 0 ; Prevent main window from hiding.
if (uMsg = 0x0018 && lParam = 1) ; SW_PARENTCLOSING = 1
return 0 ; Prevent owned window from minimizing.
}
主窗口标题
[#SingleInstance](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/commands/_SingleInstance.htm) 及 [Reload](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/commands/Reload.htm) 机制使用脚本主窗口的标题来识别相同脚本的其他实例。[修改标题](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/commands/WinSetTitle.htm) 可以避开脚本的这种识别方式。默认标题取决于脚本的载入方式:
载入自 | 标题表达式 | 示例 |
---|---|---|
.ahk 文件 | A_ScriptFullPath " - AutoHotkey v" A_AhkVersion | E:\My Script.ahk - AutoHotkey v1.1.33.09 |
Main resource (已编译脚本) | A_ScriptFullPath | E:\My Script.exe |
其他来源 | A_ScriptFullPath " - " A_LineFile | E:\My AutoHotkey.exe - *BUILTIN-TOOL.AHK |
以下代码展示了如何通过脚本本身确定默认标题(真实标题可通过 [WinGetTitle](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/commands/WinGetTitle.htm) 获得)。
title := A_ScriptFullPath
if !A_IsCompiled
title .= " - AutoHotkey v" A_AhkVersion
; 为了获得正确的结果,this must be evaluated by the resource being executed,
; 而非 an #include (除非 #include 已通过Ahk2Exe整合进了脚本):
else if SubStr(A_LineFile, 1, 1) = "*" && A_LineFile != "*#1"
title .= " - " A_LineFile
嵌入脚本 [[v1.1.34+]](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/AHKL_ChangeLog.htm#v1.1.34.00)
通过将脚本添加为Win32 (RCDATA) 资源,可以将其嵌入到标准 AutoHotkey .exe 文件中。可以在命令行中指定一个嵌入脚本,或者使用 [#Include](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/commands/_Include.htm) 时星号 (*) 后跟资源名称。对于一个整数 ID,资源名必须为井号 (#) 后跟一个十进制数。
程序会从以下来源中自动载入脚本代码,如果它们出现在文件中:
ID | Spec | 用法 |
---|---|---|
1 | *#1 | 从.exe文件创建 [编译脚本](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/Scripts.htm#ahk2exe) 就是使用这种方法。该脚本会自动运行,并且大部分命令行开关都传给脚本,而不是由程序进行翻译。外部脚本和替换嵌入式脚本(alternative embedded scripts)可使用[/script](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/Scripts.htm#SlashScript) 开关来执行。 |
2 | *#2 | 如果出现,该脚本会在程序载入任何脚本和任意使用[/include](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/Scripts.htm#SlashInclude)指定的文件前自动 “included”。 |
如果主脚本的来源是嵌入式资源,程序将进入"编译脚本(compiled script)"模式,例外的是 [A_AhkPath](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/Variables.htm#AhkPath) 会一直保存当前可执行文件的路径(和[A_ScriptFullPath](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/Variables.htm#ScriptFullPath)相同)。对于*#1以外的资源,资源标识符包含在 [主窗口标题](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/Program.htm#title) 中,以支持 [#SingleInstance](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/commands/_SingleInstance.htm) 和 [Reload](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/commands/Reload.htm)。
当从嵌入资源代码进行引用时,[A_LineFile](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/Variables.htm#LineFile) 会包含一个星号(*),后跟资源名称。
命令行用法
命令行用法参考[Passing Command Line Parameters to a Script](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/Scripts.htm#cmd) ,其中介绍了一系列影响程序行为的命令行开关。
AutoHotkey.exe的可移植性
启动.ahk脚本的唯一依赖应是 AutoHotkey.exe 文件。
[v1.0.90+:](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/AHKL_ChangeLog.htm#L51) 对 AutoHotkey.exe 重命名会修改其[默认自动运行](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/Scripts.htm#defaultfile)的脚本,在未安装AutoHotkey 的电脑上可以作为编译待用脚本的一种替代方法。例如,未提供文件名时 MyScript.exe 会自动运行MyScript.ahk 脚本,还可以运行其他脚本。
安装选项
向安装器传入 /S 参数,将 AutoHotkey 静默安装至默认目录(和非静默模式下显示的目录相同)。例如:
AutoHotkey110800_Install.exe /S
使用 /D 参数指定其他安装目录(未使用 /S 时,这样做将修改安装过程中显示的默认目录)。例如:
AutoHotkey110800_Install.exe /S /D=C:\Program Files\AutoHotkey
版本:如果之前安装过 AutoHotkey ,安装器会检测 AutoHotkey.exe 是什么版本,并将其设为默认。否则,默认是 Unicode 32-bit 或 Unicode 64-bit,具体取决于 OS 是否为 64-bit。为了重写 AutoHotkey.exe 的默认版本,传入以下开关:
/A32
或/ANSI
: ANSI 32-bit。/U64
或/x64
: Unicode 64-bit (仅在 64-bit 系统上有效)。/U32
: Unicode 32-bit。
例如,以下静默安装将 ANSI 32-bit 设为默认:
AutoHotkey110800_Install.exe /S /A32
卸载: 向 Installer.ahk 传入 /Uninstall
参数,以静默方式卸载 AutoHotkey。例如:
"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: 近期版本的安装器在右下角处包含了一个链接,无需安装即可提取出现 setup 文件。如果需要这个功能,可在命令行使用 /E
开关来调用它。例如:
AutoHotkey110903_Install.exe /D=F:\AutoHotkey /E
Restart scripts [[v1.1.19.02+]](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/AHKL_ChangeLog.htm#v1.1.19.02): 静默安装/卸载模式下,运行脚本会自动关闭,这也是必要的。传入 /R
开关以自动重新载入这些脚本,利用它们所依赖运行的 EXE,不带 命令行参数。Setup会尝试通过资源管理器来启动脚本,如果启用了 UAC,则它们不会以管理员身份运行。
Taskbar buttons [[v1.1.08+]](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/AHKL_ChangeLog.htm#v1.1.08.00): 在 Windows 7 及更新版本OS中,多个脚本的任务栏按钮会自动合成一组或默认合成一个按钮。 Separate taskbar buttons 选项可禁用这种行为,并将每个 AutoHotkey 可执行文件注册为一个 host app (IsHostApp)。
[v1.1.24.02+:](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/AHKL_ChangeLog.htm#v1.1.24.02) 对于命令行安装,指定 /IsHostApp 或 /IsHostApp=1 启用选项,/IsHostApp=0 禁用选项。
Run with UI Access [[v1.1.24.02+]](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/AHKL_ChangeLog.htm#v1.1.24.02)
安装 GUI 有一个选项为"添加 ‘Run with UI Access’ 至上下文菜单"。该上下文菜单选项为常见的[UAC有关问题](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/FAQ.htm#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访问的脚本,只要 [Run](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/commands/Run.htm) 恰当的 UIA.exe 文件,并带上常规的[命令行参数](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/Program.htm#cmd)。
已知限制:
- UIA 只在文件处于信任位置时有效,比如 Program Files 的子目录。
- 一台计算机上创建的 UIA.exe 文件不能在另一台计算机上运行,除非安装上相同的数字证书。
- 因为安全限制,UIA.exe 文件无法通过 CreateProcess 来启动。可使用 ShellExecute 来替代。[Run](mk:@MSITStore:C:\Program Files\AutoHotkey\AutoHotkey.chm::/docs/commands/Run.htm) 会尝试两种方法。
- UIA.exe 文件不能被修改,因为这样会损坏其数字签名。
- UIA 程序运行于不同于其他程序的 “integrity level”,它们只能访问由其他 UIA 程序注册的对象。例如
ComObjActive("Word.Application")
会失败,因为 Word 没有标记为 UI Access。 - 为了安全,脚本自身的窗口不能被非UIA程序/脚本自动化。
- 运行使用了 mouse hook (即使只是简单的
#InstallMouseHook
)的非UIA脚本,当鼠标所指向的窗口属于一个UIA脚本时,可能会让所有鼠标热键停止工作,即使热键是由UIA脚本本身实现的。一个办法是确保UIA脚本在最后载入。
更多详情,参考文档论坛上的Enable interaction with administrative programs 。