指南和概述

这个简短的介绍将帮助您马上开始编写您自己的宏和热键脚本.

指南目录

创建脚本

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

创建新脚本:

  1. 下载 并安装 AutoHotkey.
  2. 在桌面或您选择的文件夹中右键点击空白处.
  3. 在菜单中, 选择 新建-> AutoHotkey 脚本.
  4. 输入文件名, 确保它以 .ahk 结尾. 例如:Test.ahk
  5. 右键点击此文件并选择 Edit Script.
  6. 在新的空行中,输入下列内容:#space::Run www.google.com

在上面的语句行中, 首个字符 "#" 表示 Windows 键; 所以 #space 表示按住 Windows 键然后按下空格键来激活热键. 双冒号 :: 表示每次按下此热键时会执行其后续命令, 这里是转到 Google 网站. 要试用此脚本, 请继续下列操作:

  1. 保存并关闭此文件.
  2. 双击此文件来运行. 在任务栏通知区域会出现新的图标.
  3. 按住 Windows 键并按下空格键. 在默认浏览器中会打开网页.
  4. 要退出或编辑此脚本, 则在任务栏通知区域的绿色 "H" 图标上点击右键.

注意:

启动程序或文档

可以使用 Run 命令来其中程序, 文档, URL 或快捷方式. 这里有一些常见示例:

Run Notepad
Run C:\My Documents\Address List.doc
Run C:\My Documents\My Shortcut.lnk
Run www.yahoo.com
Run mailto:someone@somedomain.com

通过加上 热键标签 可以把上面例子的任何一个设置为热键. 在下面的首个例子中, 设置的热键为 Win+N, 而在第二个中为 Control+Alt+C:

#n::Run Notepad
^!c::Run calc.exe

上面的例子被称为单行热键, 因为它们只包含单个命令. 要在一个热键中执行多个命令,请把首行放在热键定义的下面,且在最后行命令的下一行添加 return。例如:

#n::
Run http://www.google.com
Run Notepad.exe
return

如果要运行的程序或文档没有在环境变量中, 那么需要指定它的完整路径才能运行:

Run %A_ProgramFiles%\Winamp\Winamp.exe

在上面的例子中, %A_ProgramFiles% 是 内置变量. 使用它而不使用像 C:\Program Files 这样的, 脚本可以有更好的移植性, 这表示它在其他电脑上能执行的可能性更大. 注意: 命令和变量的名称是不区分大小写的. 例如, "Run" 等同于 "run", 而 "A_ProgramFiles" 等同于 "a_programfiles".

要让脚本等到程序或文档关闭后才继续执行, 请使用 RunWait 代替 Run. 在下面的例子中, 一直到用户关闭记事本后 MsgBox 命令才会继续执行.

RunWait Notepad
MsgBox The user has finished (Notepad has been closed).

要学习关于启动程序的更多内容, 例如传递参数, 指定工作目录和找到程序的退出代码, 请点击 此处.

发送键击和鼠标点击

使用 Send 命令可以发送键击到活动的 (最前面的) 窗口. 在下面的例子中,Control+Alt+S被设置为输入签名的热键(在按下此热键前必须确保编辑器或电子邮件这样的窗口是活动的):

^!s::
Send Sincerely,{Enter}John Smith
return

在上面的例子中, 除 {Enter} 外的所有字符都按原义发送, 而它则模拟按下了 Enter 键. 下一个例子演示了其他一些常用的特殊字符:

Send ^c!{tab}pasted:^v

上面这行发送 Control+C 跟着 Alt+Tab 跟着字符串 "pasted:" 和 Control+V. 要了解特殊字符和按键的完整列表, 请参阅 Send.

最后, 可以用您输入的缩写来触发发送键击的动作, 这被称为 热字串. 例如,每当您输入“Btw”跟着空格或逗号时,下面这行会把它替换为“By the way”:

::btw::by the way

鼠标点击:要发送鼠标点击到窗口,首先必须确定要点击的 X 和 Y 坐标。这个可以用 Window Spy 来完成, 它包含在 AutoHotkey 中. 下列步骤说明了使用 Window Spy 的方法:

  1. 在脚本托盘图标菜单或开始菜单中运行 Window Spy.
  2. 通过点击感兴趣的标题栏, alt-tab 切换或其他方法激活窗口 (Window Spy 被设计为保持 "置顶").
  3. 移动鼠标光标到目标窗口中想要的位置并记下 Window Spy 中显示的鼠标坐标 (或在 Windows XP 和早期版本中, 按下 Shift-Alt-Tab 来激活 Window Spy, 这样可以复制和粘贴 "冻结的" 坐标).
  4. Click 命令中使用上面找到的坐标. 下面的例子点击鼠标左键:Click 112, 223

要移动鼠标而不进行点击, 请使用 MouseMove. 要拖拉鼠标, 请使用MouseClickDrag.

激活和操作窗口

要激活窗口 (使它最前面), 请使用 WinActivate. 要判断窗口是否存在, 请使用 IfWinExistWinWait. 下面的例子演示了这些命令:

IfWinExist Untitled - Notepad
{
    WinActivate
}
else
{
    Run Notepad
    WinWait Untitled - Notepad
    WinActivate
}

上面的例子会首先搜索标题以 "无标题 - 记事本" (区分大小写) 开始的任何现有的窗口. 如果找到这样的窗口, 则激活它. 否则, 启动记事本并等待无标题窗口的出现, 出现后激活它. 上面的例子还利用了 最近找到的窗口, 这样可以不需要在每个 WinActivate 中指定窗口标题.

其他一些常用的窗口命令是:

利用 MsgBox, InputBox 等从用户中获取输入.

下面的例子显示带两个按钮的对话框 (是 和 否):

MsgBox, 4, , Would you like to continue?
IfMsgBox, No
    return
; 否则, 用户选择了是.
MsgBox You pressed YES.

使用 InputBox 命令来提示用户输入字符串. 使用 FileSelectFileFileSelectFolder 来让用户选择文件或文件夹. 对于更高级的任务, 请使用 Gui 命令来创建自定义数据输入窗体和用户界面.

提示: 您也许已经从其他例子中注意到任何命令中的首个逗号可以省略 (除非首个参数为空或以 := 或 = 开始, 或命令单独处于 延续片段 的顶部). 例如:

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

使用变量和剪贴板

变量 是脚本用来存储文本或数字的内存块. 只包含数字的变量 (可以含小数点) 在数学运算或比较时会被自动转换为数字.

除了 函数 中的局部变量外, 所有的变量都是全局的; 即可以在脚本的任意位置读取或改变它们的内容. 此外, 变量不需要声明; 简单地使用它们就可以让它们存在 (且每个变量都以空或空白开始).

要把字符串赋值给变量, 请参照这些例子:

MyVar1 = 123
MyVar2 = my string
要把变量的内容和数字或字符串进行比较, 请参照这些例子:
if MyVar2 = my string
{
    MsgBox MyVar2 contains the string "my string".
}
if MyVar1 >= 100
{
    MsgBox MyVar1 contains %MyVar1%, which is a number greater than or equal to 100.
}

在上面的 MsgBox 行中, 注意第二个出现的 MyVar1 被括在百分号内. 这样在那里显示了 MyVar1 的内容. 使用相同的手法能用来复制一个变量的内容给另一个变量. 例如:

MyVarConcatenated = %MyVar1% %MyVar2%

上面这行把字符串 "123 my string" (不含引号) 保存到变量 MyVarConcatenated.

要比较两个变量的内容, 请参照此例:

if (ItemCount > ItemLimit)
{
    MsgBox The value in ItemCount, which is %ItemCount%, is greater than %ItemLimit%.
}

注意上面例子的首行包含小括号. 小括号表示这个 if 语句包含 表达式. 如果没有它们, 那行将被视为 "非表达式 if 语句", 并且因此需要使用百分号括住 ItemLimit (这样的 if 语句被限制为只能包含简单的比较运算符, 而不能包含数学运算符或像 "AND" 和 "OR" 这样的联合运算符).


数学:要执行数学运算,请使用冒号-等号运算符(:=)来把表达式的结果赋值给变量,例如:

NetPrice := Price * (1 - Discount/100)

请参阅 表达式 来了解数学运算符的完整列表.


剪贴板: Clipboard 变量是特殊变量, 因为它包含了 Windows 剪贴板中当前的文本. 即使如此, 它的用法也和普通变量一样. 例如, 下面这行将显示剪贴板当前的内容:

MsgBox %clipboard%

要改变剪贴板的内容, 请参考下面的例子, 它用新文本替换了剪贴板的当前内容:

clipboard = A line of text.`r`nA second line of text.`r`n

在上面, `r 和 `n (重音符后跟着字母 "r" 或 "n") 用来表示两个特殊字符: 回车和换行. 这两个字符在文本中开始新行, 就像用户按下了 Enter 键.

要追加文本到剪贴板 (或其他任何变量), 请参照此例:

clipboard = %clipboard% And here is the text to append.

请参阅 剪贴板变量 章节了解详情.

反复重复一系列动作

要多次连续地重复执行一些操作, 请使用 循环. 下面的循环会显示三次 MsgBox:

Loop 3
{
    MsgBox This window will be displayed three times.
}

您还可以在单词 Loop 后指定变量, 这可以用于循环次数在脚本某个位置定义的时候:

Loop %RunCount%
{
    Run C:\Check Server Status.exe
    Sleep 60000  ; 暂停 60 秒.
}

在上面的例子中, 循环会执行指定的次数, 但是如果 RunCount 的值为 0, 则会完全跳过循环.

当一个或多个条件改变时循环还可以终止它自己. 下面的例子中当用户按住 F1 键时会重复点击鼠标左键:

$F1::  ; 把 F1 键设置为热键 ($ 符号会有助于下面 GetKeyState 的 "P" 模式).
Loop  ; 由于没有指定数字, 所以这是个无限循环, 直到遇到内部的 "break" 或 "return".
{
    if not GetKeyState("F1", "P")  ; 如果此状态为 true, 那么用户实际已经释放了 F1 键.
        break  ; 中断循环.
    ; 否则 (由于上面没有 "中断"), 继续点击鼠标.
    Click  ; 在当前指针位置点击鼠标左键.
}
return

在上面的例子中, 当用户按下 F1 键时, 循环会检测到并通过 break 命令停止它自己. Break 会使得执行跳转到循环闭括号后的行.

另一种实现此目的的方法是使用 "while" 循环:

$F1::
while GetKeyState("F1", "P")  ; 当 F1 键实际被按住时.
{
    Click
}
return

上面的示例演示了一般用途的循环. 对于更多特殊的需要, 请考虑下面这些循环:

文件读取/写入循环: 逐行读取文本文件的内容, 每次一行. 这可以用来一行接一行地把文件转换成不同的格式. 它还可以用来搜索匹配条件的行.

文件和文件夹循环: 获取指定的文件或文件夹, 每次一个. 这可以用来对符合条件的文件或文件夹进行操作.

解析循环: 从一个字符串中获取子字符串, 每次一个. 这可以用来很容易的分解像 "Red,Green,Blue" 这样的字符串为三个子片段.

注册表循环: 获取指定的注册表子键的内容, 每次一个项目.

操作文件和文件夹

要添加文本到文件的末尾 (或创建新文件), 请使用 FileAppend, 如下面的例子所示. 注意它使用 `n (换行符) 来开始新的文本行:

FileAppend, A line of text to append.`n, C:\My Documents\My Text File.txt

要覆盖现有的文件, 请在 FileAppend 之前使用 FileDelete. 例如:

FileDelete, C:\My Documents\My Text File.txt

其他一些常用的文件和文件夹命令是:

其他功能概述

请参阅 命令列表 了解每个命令的概述.