这个简短的介绍将帮助您马上开始编写您自己的宏和热键脚本.
每个脚本都是需由程序 (AutoHotkey.exe) 执行的包含命令的纯文本. 脚本中还可以包含 热键 和 热字串 或者甚至完全由它们组成. 不过, 在不包含热键和热字串时, 脚本会在启动后从上往下按顺序执行其中的命令.
创建新脚本:
Test.ahk
。#space::Run www.google.com
。在上面的语句行中, 首个字符 "#" 表示 Windows 键; 所以 #space 表示按住 Windows 键然后按下空格键来激活热键. 双冒号 :: 表示每次按下此热键时会执行其后续命令, 这里是转到 Google 网站. 要试用此脚本, 请继续下列操作:
注意:
可以使用 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 的方法:
Click 112, 223
。要移动鼠标而不进行点击, 请使用 MouseMove. 要拖拉鼠标, 请使用MouseClickDrag.
要激活窗口 (使它最前面), 请使用 WinActivate. 要判断窗口是否存在, 请使用 IfWinExist 或 WinWait. 下面的例子演示了这些命令:
IfWinExist Untitled - Notepad { WinActivate } else { Run Notepad WinWait Untitled - Notepad WinActivate }
上面的例子会首先搜索标题以 "无标题 - 记事本" (区分大小写) 开始的任何现有的窗口. 如果找到这样的窗口, 则激活它. 否则, 启动记事本并等待无标题窗口的出现, 出现后激活它. 上面的例子还利用了 最近找到的窗口, 这样可以不需要在每个 WinActivate 中指定窗口标题.
其他一些常用的窗口命令是:
下面的例子显示带两个按钮的对话框 (是 和 否):
MsgBox, 4, , Would you like to continue? IfMsgBox, No return ; 否则, 用户选择了是. MsgBox You pressed YES.
使用 InputBox 命令来提示用户输入字符串. 使用 FileSelectFile 或 FileSelectFolder 来让用户选择文件或文件夹. 对于更高级的任务, 请使用 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
其他一些常用的文件和文件夹命令是:
请参阅 命令列表 了解每个命令的概述.