当前位置: 首页 > 工具软件 > AutoHotKey > 使用案例 >

如何使用 AutoHotkey

水飞掣
2023-12-01

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_AhkVersionE:\My Script.ahk - AutoHotkey v1.1.33.09
Main resource (已编译脚本)A_ScriptFullPathE:\My Script.exe
其他来源A_ScriptFullPath " - " A_LineFileE:\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,资源名必须为井号 (#) 后跟一个十进制数。

程序会从以下来源中自动载入脚本代码,如果它们出现在文件中:

IDSpec用法
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

 类似资料: