20230521-AutoHotKey使用教程和脚本推荐

https://www.autohotkey.com/

windows自动化效率神奇,autohotkey 使用教程和脚本推荐

autohotkey 是一款windows 平台下的热键脚本语言程序,可以实现诸如窗口置顶,快速输入、快捷操作等丰富多彩的功能

能够通过自定义脚本实现很多快捷、自动化操作,乃至创建图形界面程序,而且占用资源极小,是一个能够高度自定义,可用性极高的工具

这里就介绍下如何通过autohotkey 来提高我的操作效率

autohotkey 使用方法

下载并解压 autohotkey 绿色版,绿色版,将脚本文本拖动到上面即可启用脚本

使用示例,新建文本文件,编写脚本如下

1
2
3
4
5
6
;这里的 “分号” 表示注释
;快捷键 alt + n 打开记事本
!n::Run notepad

;快捷键 alt + y 打开百度云管家
!y::Run H:\GanJingYunV2\BaiduYunGuanjia.exe

保存为test.ank 脚本后缀名都为 .ank

右键选择 打开方式,浏览计算机中的程序,定位到autohotkey 软件所在目录中,选择autohotkeyU64.exe 确定

以后双击脚本,即可运行,这时就可以通过快捷键 alt+n 启动记事本,通过 alt+y 启动百度云管家了

自制快捷启动器

下面带大家开始写一个快捷启动脚本,很简单,这里分成3部分来说

热键标记

! 是热键标记,这里的感叹号代表键盘上的alt 键
!n 即对应键盘热键alt+n

常用热键标记对应关系

1
2
3
4
# win 键
! alt
^ ctrl
+ shift

2. 连接

符号:: 意味着每次按下前面的热键时,随后的命令将会被执行,这里用来连接热键标记和run 命令

3. Run 命令

run 命令:用来启动一个程序,文档、url 网址或者快捷方式,如

1
2
3
4
Run Notepad
Run C:\My Documents\Address List.doc
Run www.yahoo.com
Run mailto:someone@somedomain.com

把上面3部分组合起来即可实现自定义快捷键

比如我想通过按Ctrl+q启动位于 D:\software\QQ.exe 的QQ程序,按alt+b打开百度,可以这样写

1
2
^q::Run D:\software\QQ.exe
!b::Run www.baidu.com

这样,大家就可以自定义自己的程序启动热键了

脚本推荐

  1. 快捷启动

即上面介绍的例子,自定义快捷键,快速打开程序、文件、网址等,这里给出一个模板,大家可以根据需要编辑修改

鼠标债见音量控制

把鼠标浮动在任务栏时,可以通过滚轮来调节音量,点击中键开启或关闭声音

屏幕键盘

在屏幕下方显示一个透明的模拟键盘,来实时显示我们按下的按键,也都来学习盲打时


创建脚本

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

创建新脚本

输入文件名,确保以 .ahk 结尾,例如 test.ahk
右键点击此文件并选择edit script

在新的空行中,输入下列内容, #space::Run www.bing.com

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

保存并关闭此文件

双击此文件来运行,在任务栏通知区域会出现新的图标

按住windows 键并按下空格键,在默认浏览器中会打开网页

要退出或编辑此脚本,则在任务栏通知区域的绿色H 图标点击右键

注意

多个脚本可以同时运行,其中的每个脚本在任务栏通知区域使用自己的图标

每个脚本可以包含多个热键 和热字串

要让您的脚本在启动计算机时自动运行,请在开始菜单的启动文件夹中给您的脚本创建快捷方式

启动程序或文档

可以使用run 命令来打开其中程序,文档,url 或快捷方式,这里有一些常见示例

1
2
3
4
5
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

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

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

1
2
3
4
#n::
Run http://www.google.com
Run Notepad.exe
return

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

1
Run %A_ProgramFiles%\Winamp\Winamp.exe

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

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

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

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

发送键击和鼠标点击

使用send 命令可以发送剪辑到活动的最前面的窗口,在下面的例子中,control+alt+s 被设置为输入签名的热键 在按下此热键前必须确保编辑器或电子邮件这样的窗口是活动的

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

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

1
Send ^c!{tab}pasted:^v

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

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

1
::btw::by the way

鼠标点击

要发送鼠标点击到窗口,首先必须确定要点击的x 和y 坐标,这个可以用window spy 来完成,它包含在autohotkey 中,下列步骤说明了使用window spy 的方法

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

要移动鼠标而不进行点击,请使用mousemove 要拖拉鼠标,请使用mouseclickdrag

激活和操作窗口

要激活窗口 使它最前面,请使用winactivate 要判断窗口是否存在,请使用ifwinexist 或winwait 下面的例子演示了这些命令

1
2
3
4
5
6
7
8
9
10
IfWinExist Untitled - Notepad
{
WinActivate
}
else
{
Run Notepad
WinWait Untitled - Notepad
WinActivate
}

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

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

IfWinActive: 检查指定的窗口当前是否活动.
WinWaitActive: 等待指定窗口变为活动窗口 (通常用在激活窗口的键击后面, 例如按下 Control-F 来打开 “查找” 窗口).
WinClose: 关闭指定的窗口.
WinMove: 改变指定窗口的位置和/或大小.
WinMinimize, WinMaximize, WinRestore: 分别最小化, 最大化或还原指定窗口.

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

下面的例子显示带两个按钮的对话框

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

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

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

使用变量和剪贴板

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

除了函数中的局部变量外,所有的变量都是全局的,即可以在脚本的任意位置读取或改变它们的内容

此外,变量不需要声明,简单地使用它们就可以让它们存在 且每个变量都以空或空白开始

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

1
2
MyVar1 = 123
MyVar2 = my string

要把变量的内容和数字或字符串进行比较,请参照这些例子

1
2
3
4
5
6
7
8
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

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

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

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

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

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

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

剪贴板

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

1
MsgBox %clipboard%

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

1
clipboard = A line of text.`r`nA second line of text.`r`n
1
2
3
在上面`r `n 用来表示两个特殊字符,回车和换行,这两个字符在文本中开始新行,就像用户按下了enter键


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

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

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

反复重复–一系列动作

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

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

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

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

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

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

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

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

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

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

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

文件读取/写入循环,逐行读取文本文件的内容,每次一个,这可以用来对符合条件的文件或文件夹进行操作

解析循环,从一个字符串中获取子字符串,每次一个,这可以用来很容易的分解像 red green blue 这样的字符串为三个子片段

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

操作文件和文件夹

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

要覆盖现有的文件,请在fileappend 之前使用filedelete ,例如

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

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

FileRead: 读取整个文件的内容到变量.
文件读取循环: 逐行读取文本文件的内容.
IfExist: 检查文件或文件夹是否存在.
FileSelectFile 和 FileSelectFolder: 显示可以让用户选取文件或文件夹的对话框.
FileDelete/FileRecycle: 删除/回收一个或多个文件. 使用 FileRemoveDir 来删除整个文件夹.
FileCopy/FileMove: 复制/移动一个或多个文件. 使用 FileCopyDir/FileMoveDir 来复制/移动整个文件夹.
文件和文件夹循环: 获取文件夹中包含的子文件夹和文件, 每次一个.
FileSetAttrib 和 FileSetTime: 改变一个或多个文件的属性或时间戳.
IniRead, IniWrite 和 IniDelete: 创建, 访问和操作标准格式的 INI 文件.
RegRead, RegWrite, RegDelete 和 注册表循环: 操作 Windows 注册表.

命令和函数索引

{ ... } 一对大括号组成的区域表示一个区块,区块通常与函数 else loop while 循环和if 命令一起使用

{...} 创建脚本化关联数组

[...] 创建含整数键的脚本化关联数组

break 退出 终止循环,在各种循环中都是有效的

catch 指定在执行try 语句发生异常时执行的代码

click 在指定坐标处点击鼠标按钮,它还可以按下鼠标按钮,转动鼠标滚轮或移动鼠标

clipwait 等待,一直到剪贴板包含数据

comobjcreate 创建com 对象

dllcall 调用dll 文件中的函数,例如标准的windows api 函数

else 指定当if 语句计算结果为false 时执行的命令,包含多个命令时,需要把它们括在 区块中

envadd 设置变量的值为它自身加上给定的值的和,还可以从日期-时间值中增加或减去时间,同义 于 var+= value

ExitApp 无条件终止脚本

FileAppend 在文件末尾处追加文本 如果有必要,首先创建文本

FileDelete 删除一个或多个文件

FileOpen 提供面向对象的文件io

fileread 读取文件的内容到变量

fileselectfile 显示可以让用户打开或保存文件的标准对话框

Finally 确保 在try 语句结束后总是会执行的代码块

For 对对象中的每对键值对重复执行一系列命令

Gosub 跳转到指定的标签并继续执行

Gui 创建和管理窗口和控件,这种窗口可以用作数据输入窗体或自定义用户界面

if 指定在变量与值比较结果为true 时执行的命令,包含多个命令时,需要把它们括在区块 大括号中

ifwinExist 检查指定的窗口是否存在

inputbox 显示输入框让用户输入字符串

loop 普通 重复执行一系列命令:可以指定表示重复次数的数字或直到遇到break

loop 读物文件内容 逐行读取文本文件的内容,每次一行,比filereadline 执行的更好

MouseGetPos 获取鼠标光标的当前位置以及鼠标当前悬停的窗口和控件,可选的

MsgBox 在含有一个或个多按钮 的小窗口中显示指定的文本

RegExMatch 判断字符串是否包含某个匹配模式 正则表达式

RegExReplace 替换字符串中匹配模式 正则表达式 出现的地方

Return 从子程序返回到之前通过函数调用 gosub 激活 hotkey groupactivate 或其他方式执行跳转的地方

运行 运行外部程序

runwait 运行外部程序并等待期结束

Send SendRaw 发送模拟键击和鼠标点击到活动窗口

SetBatchLines 设置脚本的执行速度 影响CPU使用率

SetTimer 以指定的时间间隔自动并重复运行子程序

SetTitleMatchMode 设置在类似winwait 命令中wintitle 参数的匹配模式

setwindelay 设置在每次执行窗口命令 例如winactivate 后自动的延时

Sleep 在继续前等待指定的时间量

splitpath 把文件名或url 分解成它的名称,目录,扩展名和驱动器

StringGetPos instr 获取指定的子字符串在某个字符串中的位置

strlen 获取字符中包含的字符数量

substr从字符串的指定位置提取一个或多个字符

stringreplace 用新字符串替换执行的子字符串

Throw 发出错误发生的信号,此信号可以被try-catch 语句捕获

try 守护一个或多个语句 命令或表达式以防备由throw 命令抛出的运行时错误和异常

until 根据条件判断是否继续执行loop 或for 循环

var=value 把指定的值赋给变量

var:= expression 计算表法师并把结果保存在变量

varsetcapacity 增加或清空变量占用的内存,通常只有在特殊情况下才需要,例如 dllcall

while 循环 重复执行一系列命令,一直到指定的表达式计算结果为假

win activate 激活指定的窗口

winclose 关闭指定的窗口

win exist 返回首个匹配窗口的唯一id

wingettitle 获取指定窗口的标题

winhide 隐藏指定的窗口

winmaximize 最大化指定的窗口

winminimize 缩小指定窗口为任务栏上的按钮

winwait 等到指定的窗口出现

基本用法和语法

热键

热键有时也称为快捷键,因为它们能简便地出发动作,例如运行程序或键盘宏,

要在热键中使用多个修饰键,那么需要把它们连续地列出来,顺序无关紧要,下面的例子中使用^!s 来表示control+alt+s

1
2
3
^!s::
Send Sincerely,{enter}John Smith ; 此行发送键击到活动 (最前面的) 窗口.
return

在定义热键时您可以使用下列修饰符

# 对于 Windows Vista 及以上版本, 包含 Windows 键的热键 (例如 #a) 会等待 Windows 键被释放后才发送任何包含 “L” 键击的文本. 这样避免了这种热键中的 Send 锁定 PC。这种行为适用于除 SendPlay (这里不需要) 和 盲从模式 外的所有发送模式.

! alt

^ control

  • shift

& 和符号可以用来组合任意两个按键或鼠标按钮,让它们成为自定义热键,请参阅后面了解详情

< 使用成对按键中左边的那个 例如<!a 相当于!a 只是使用左边alt 键才可以触发

> 使用成对按键中右边的那个

<^>! altGr 如果您键盘布局中含altGr 键而非右alt 键,那么这一系列符号一般可用于表示altgr 例如

1
2
<^>!m::MsgBox You pressed AltGr+m.
<^<!m::MsgBox You pressed LeftControl+LeftAlt+m.

或者让altGr 自己成为热键,请使用下面的热键,不像上面出现的任何热键

1
LControl & RAlt::MsgBox You pressed AltGr itself.
  • 通配符,即使附加的休时间也被按住也能激发热键,这常与重映射按键或按钮组合使用,例如
1
2
*#c::Run Calc.exe  ; Win+C、Shift+Win+C、Ctrl+Win+C 等都会触发此热键。
*ScrollLock::Run Notepad ; 即使在按住其他修饰键时按下 ScrollLock 也会触发此热键。

~ 激发热键时,不会屏蔽,被操作系统隐藏,热键中按键原有的功能,在下面的两个例子中,用户的鼠标按钮点击会被发送到活动窗口

1
2
~RButton::MsgBox You clicked the right mouse button.
~RButton & C::MsgBox You pressed C while holding down the right mouse button.

注意, 与其他前缀符号不同,可以在某些热键的变体中使用颚化符前缀而其他的不使用

  1. 代替 alt-tab 的特殊热键总是忽略颚化符前缀。
    1
    [v1.1.14+]:如果把颚化符前缀用在自定义修饰键中且此修饰键自身也作为热键,则在按下此修饰键时会触发热键而不会被延迟到按键释放的时候。例如,上文中~RButton热键在按下此按键时就会触发。对于v1.1.14之前的版本(或未使用颚化符前缀), 则会在按键释放时触发其自身的热键,不过仅在未触发RButton & C组合键的时候。

$ 通常只在脚本使用send 命令发送包含了热键自身的按键时才需要使用此符号,此时可以避免触发它自己 $ 前缀强制使用键盘钩子,来实现此热键,作为一个副作用这样避免了send 命令触发它自己,$ 前缀相当于在此热键定义之前的某个位置指定的 #usehook

1
2
[v1.1.06+]: #InputLevel 和 SendLevel 对send 命令是否触发热键和热字符串提供了额外的控制功能

up

单词 UP 可以跟在热键名后面使得在释放按键时触发热键, 而不是按下时. 下面的例子把 LWin 重映射 为 LControl:

1
2
*LWin::Send {LControl Down}
*LWin Up::Send {LControl Up}

“Up”也可以用于普通热键中,例如:^!r Up::MsgBox You pressed and released Ctrl+Alt+R。它还可以用在组合键(例如 F1 & e Up::

限制:1) “Up”不能和游戏杆按钮一起使用;2) 在没有普通/按下热键副本的“Up”热键会完全接管那个按键以防被卡住。避免这种情况的一种方法是添加颚化符前缀(例如 **~**LControl up::

相关提示, 类似于上面的一种技术是让热键成为前缀键. 好处是尽管热键会在按键松开时激发, 但仅在您之前按住此前缀键时没有按其他任何键的情况下才会如此. 例如:

1
2
LControl & F1::return  ; 通过把左 control 键放在 "&" 前面至少一次来让它成为前缀键.
LControl::MsgBox You released LControl without having used it to modify any other key.

多个热键可以垂直地叠放来让它们执行相同的动作,例如

1
2
3
4
^Numpad0::
^Numpad1::
MsgBox Pressing either Control+Numpad0 or Control+Numpad1 will display this message.
return

通过不为热键或按键组合的热键指定任何操作可以在整个系统重完全禁用它们,下面的例子中禁用了右windows 键

RWin::return

上下文相关的热键

#IfWinActive/Exist 和 #If 指令可以用来让热键根据不同的条件执行不同的动作 (或什么都不做). 例如:

1
2
3
4
5
6
7
8
9
10
#IfWinActive, ahk_class Notepad
^a::MsgBox You pressed Ctrl-A while Notepad is active. Pressing Ctrl-A in any other window will pass the Ctrl-A keystroke to that window.
#c::MsgBox You pressed Win-C while Notepad is active.

#IfWinActive
#c::MsgBox You pressed Win-C while any window except Notepad is active.

#If MouseIsOver("ahk_class Shell_TrayWnd")
WheelUp::Send {Volume_Up} ; 在任务栏上滚动滚轮:增加/减小音量。
WheelDown::Send {Volume_Down} ;

自定义组合键及其他特性

通过在两个按键 不包括操纵杆按钮 间使用& 可以定义定制的组合键,在下面的例子中,您在按住numpad0 接着按下第二个按键时会触发此热键

1
2
Numpad0 & Numpad1::MsgBox You pressed Numpad1 while holding down Numpad0.
Numpad0 & Numpad2::Run Notepad

在上面的例子中,numpad0 成为前缀键,但是这也让numpad0 在被按下时失去了它原有的功能,为了避免此问题,脚本中可以配置numpad0 执行新的动作,例如下列热键的其中一个

1
2
Numpad0::WinMaximize A   ; 最大化活动/前端窗口.
Numpad0::Send {Numpad0} ; 让 Numpad0 释放 时产生 Numpad0 键击. 请参阅下面的注释.

使用上面的其中一个自定义组合热键可以在释放numpad0时执行指定的动作,但仅在您之前按住numpad0 时没有按其他任何按键的情况下,在 v1.1.14+ 中,可以在其中某个热键使用颚化符前缀来避免这种行为

Numlock, Capslock 和 Scrolllock: 这些键可以被强制设置为 “AlwaysOn” 或 “AlwaysOff”. 例如:SetNumlockState AlwaysOn。

覆盖资源管理器热键,在脚本中可以为windows 内置的热键例如Win-E和Win-R指定一个动作来个别的替换,请参阅覆盖页面了解详情

替换alt-tab 热键可以提供alt-tab切换窗口的可选方法,例如,下面的两个热键可以让您用右手进行alt-tab

1
2
RControl & RShift::AltTab  ; 按住右 control 后接着反复下右 shift 来向前移动.
RControl & Enter::ShiftAltTab ; 甚至不需要释放右 control, 直接按 Enter 来反向移动.

鼠标滚轮热键

通过键名 wheeldown 和wheelup 可以支持转动滚轮来激发热键,在 v1.0.48+ 中还支持 WheelLeft 和 WheelRight,但在早于 Windows Vista 的操作系统上没有效果。这里是一些鼠标滚轮热键的例子:

1
2
MButton & WheelDown::MsgBox You turned the mouse wheel down while holding down the middle button.
^!WheelUp::MsgBox You rotated the wheel up while holding down Control+Alt.

在 v1.0.43.03+, 内置变量 A_EventInfo 包含了滚轮转动的格数, 通常为 1. 然而在后面的情况中, A_EventInfo 可能大于或小于 1:

  • 如果鼠标硬件报告小于一格的距离, 那么 A_EventInfo 可能为 0;
  • 如果快速滚动滚轮 (取决于鼠标类型), 那么 A_EventInfo 可能大于 1. 像后面这样的热键可以帮助您分析鼠标:~WheelDown::ToolTip %A_EventInfo%

鼠标滚轮最有用的一些热键包括滚动窗口文本的可选方法. 例如, 使用下面的一对热键可以在您按住左 Control 键并转动滚轮时进行水平滚动而不是垂直滚动:

1
2
3
4
5
6
7
8
9
10
11
~LControl & WheelUp::  ; 向左滚动.
ControlGetFocus, fcontrol, A
Loop 2 ; <-- 增加这个值来加快滚动速度.
SendMessage, 0x114, 0, 0, %fcontrol%, A ; 0x114 是 WM_HSCROLL, 它后面的 0 是 SB_LINELEFT.
return

~LControl & WheelDown:: ; 向右滚动.
ControlGetFocus, fcontrol, A
Loop 2 ; <-- 增加这个值来加快滚动速度.
SendMessage, 0x114, 1, 0, %fcontrol%, A ; 0x114 是 WM_HSCROLL, 它后面的 1 是 SB_LINERIGHT.
return

最后, 由于鼠标滚轮热键只产生按下事件 (从没有弹起事件), 所以它们无法用作 弹起的按键热键.

热键技巧和备注

根据numlock 的状态,每个小键盘上的按键可以运行两个不同的热键子程序,可选的,可以让小键盘上的按键不论NumLock的状态如何都运行相同的子程序,例如

1
2
3
4
NumpadEnd::
Numpad1::
MsgBox, This hotkey is launched regardless of whether Numlock is on.
return

如果颚化符~ 和前缀键一起使用,即使只是一次,那么其中的前缀总是会被发送到活动窗口,例如,在下面的两个热键中,活动窗口都会收到右键点击,尽管只是其中一个热键使用了颚化符

1
2
~RButton & LButton::MsgBox You pressed the left mouse button while holding down the right.
RButton & WheelUp::MsgBox You turned the mouse wheel up while holding down the right button.

Suspend 命令可以临时禁用所有的热键 但不包括您要排除的那些,要得到更大的选择性,请使用 #IfWinActive/Exist.

通过使用hotkey 命令,可以在脚本运行时动态创建热键,hotkey 命令还能单独地修改,禁用或启用脚本现有的热键

操纵杆热键当前不支持修饰符前缀,例如 ^ (Control)# (Win). 不过, 您可以使用 GetKeyState 来模仿这种效果, 如下所示:

1
2
3
4
5
Joy2::
if not GetKeyState("Control") ; 左边和右边的 Control 键都没有按下.
return ; 即什么都不做.
MsgBox You pressed the first joystick's second button while holding down the Control key.
return

如果热键应该在继续执行前等待其修饰键释放,这可能需要一些时间,请参考下面的例子

1
^!s::Send {Delete}

按下 Control-Alt-S 会让系统以为您按下了 Control-Alt-Delete (由于系统对 Ctrl-Alt-Delete 的侵略性检测). 要变通解决此问题, 请使用 KeyWait 来等待按键释放; 例如:

1
2
3
4
5
^!s::
KeyWait Control
KeyWait Alt
Send {Delete}
return

如果像#z:: 这样的热键标签产生了乌龙茶无效热键的错误,那么您的系统键盘布局语言可能不包含特殊字符,尝试使用您键盘布局中您知道的其他字符

热键标签可以作为 gosub 或goto 的目标,例如 gosub ^!s

热键的一个常见用途是启动和停止重复的动作,例如一系列的键击或鼠标点击,关于这方面的例子,请参阅这个FAQ主题

最后,每个脚本都是准多线程的,这样可以在之前的热键子程序还在运行时启动新的热键,例如,即使在当前热键显示msgbox 时也能启动新热键

alt-tab 热键

每个alt-tab 热键必须是两个键的组合,通常通过和符号& 实现,在下面的例子中,按住右alt 键并按下J 或K 可以导航alt-tab 菜单

1
2
RAlt & j::AltTab
RAlt & k::ShiftAltTab

AltTab 和shiftAltTab 是两个特殊的命令,它们仅在与热键在同一行时才能被识别,这里是完整的列表

alttab 如果alttab 菜单可见,那么在菜单中前移,否则,显示菜单

shiftalttab 与上面相同,不过这里在菜单中后移

AltTabAndMenu:如果 alt-tab 菜单可见,那么在菜单中前移。否则, 显示菜单.

AltTabMenuDismiss: 关闭 Alt-tab 菜单.

为了举例说明上述命令,可以用鼠标滚轮完全代替alt-tab 当下面的热键生效时,点击鼠标中键显示菜单,转动滚轮在菜单中导航

1
2
3
MButton::AltTabMenu
WheelDown::AltTab
WheelUp::ShiftAltTab

要取消热键调用的alt-tab 菜单而不激活选择的窗口,请使用类似下面这样的热键,它可能需要根据后面的这些进行调整,最初显示alt-tab 菜单的方法,和2 脚本是否安装了键盘钩子

1
2
3
4
5
LCtrl & CapsLock::AltTab
!MButton:: ; 鼠标中键. ! 前缀让它在按住 Alt 键时激发 (当 alt-tab 菜单可见时, alt 键是按住的).
IfWinExist ahk_class #32771 ; 表示 alt-tab 菜单出现在屏幕上.
Send !{Escape}{Alt up}
return

当前,所有特殊的alt-tab 动作必须像上面的例子那样直接指定到热键上,
自定义的alt-tab 动作还可以通过热键创建,在下面的例子中,按下f1来显示菜单并预先向前移动,然后可以按下f2 来激活选择的窗口,或按下escape 取消

1
2
3
4
5
6
*F1::Send {Alt down}{tab} ; 这里需要星号.
!F2::Send {Alt up} ; 释放 Alt 键激活选择的窗口.
~*Escape::
IfWinExist ahk_class #32771
Send {Escape}{Alt up} ; 取消菜单而不激活选择的窗口.
return

热字串和自动替换

入门和简单示例

尽管热字串主要用于在您输入缩写时进行扩展,自动替换,但是它们也可以用来运行任何脚本动作,从这个角度看,它们类似于热键,只是它们通常由多个字符组成,即字符串

要定义热字串,请用两个冒号包围用来触发的缩写,例如

1
::btw::by the way

上面的 “by the way” 示例被称为自动替换热字串, 因为输入的文本被自动替换为第二个双冒号后指定的字符串. 与之相比, 热字串还可以定义用来执行任何自定义动作, 例如. 注意命令必须放在热字串的 下面.

1
2
3
4
5
6
7
8
::btw::
MsgBox You typed "btw".
return

:*:]d:: ; 此热字串通过后面的命令把 "]d" 替换成当前日期和时间.
FormatTime, CurrentDateTime,, M/d/yyyy h:mm tt ; 看起来会像 9/1/2005 3:53 PM 这样
SendInput %CurrentDateTime%
return

尽管上面的两个例子不是自动替换的热字串,但默认情况下您输入的缩写也会被擦除,这是通过自动退格来实现的,此特性可以通过b0 选项禁用

终止符

除非使用了星号选项,否则您必须在热字串的缩写后输入终止符才能触发它

开始时终止符包含下列字符
:-()[]{}’:;”/,.?!n t(注意 n 是回车,t 是 Tab,且在它们之间还有一个原义的空格)。通过编辑下列示例可以改变这个字符集合,这个例子中为 所有的 热字串设置新的终止符,而不仅是在它下面的那些。

1
#Hotstring EndChars -()[]{}:;'"/\,.?!`n `t

选项

可以使用下面的两种方式改变热字串的默认行为

#Hostring 指令,它会影响脚本中实际在它后面的所有热字串,下列示例会让C 和R 选项生效

下面列表中对每个选项进行说明,当使用上面的方法指定多个选项时,可以在选项间包含空格

  • 星号 不需要终止符,即空格,句点或回车来触发热字串
1
:*:j@::jsmith@somedomain.com

上面的示例会在您输入@字符时立即进行替换,如果在#hostring 指令中含有此选项,那么可以使用*0来关闭它

? 问号即使此热字串在另一个单词中也会被处罚,即,在字符串被混排前立即输入字符,例如,如果 :?:al::airline 为热字串,那么输入“practical ”会得到“practicairline ”。使用 ?0 来关闭此选项.

B0 (B 后跟着零): 不 进行自动退格来擦除您输入的缩写. 关闭此选项后可以使用 B 来启用. 脚本还可以通过 {bs 5} 实现自己的退格, 这里发送 5 次退格. 同样地, 可以通过 {left 5} 发送左方向键的键击. 例如,下面的热字串产生“<em></em>”并把光标向左移动 5 个位置(这样它就在标签之间了):

1
:*b0:<em>::</em>{left 5}

C 区分大小写,当您输入缩写时,它必须准确匹配脚本中定义的大小写形式,使用C0 可以关闭区分大小写的特性

C1 不遵循输入的大小写形式,使用此选项可以让 自动替换热字串 不区分大小写且阻止它们遵循您实际输入字符的大小写形式. 遵循大小写形式的热字串 (这是默认状态) 会在您输入的缩写都为大写时产生大写形式的的替换文本. 如果您的输入只有首字母为大写,那么替换的首字母也会为标题格式(如果首个字符是字母)。您按其他任何大小写形式输入时, 替换会准确按照定义进行发送. 如果在 #Hotstring 指令 中含有此选项, 那么可以使用 C0 来关闭它, 这样可以让热字串重新遵循大小写.

Kn 按键延迟,这个非常少用的选项设置在自动退格或自动替换产生的键击之间的延迟,给n指定新的延迟,例如,指定k10来设置10ms 的延迟而k-1 则取消延迟,此选项的实际效果取决于当前生效的发送模式

SI (SendInput): 由于此模式是没有延迟的, 所以按键延迟会被忽略. 例外是当 SendInput 不可用时, 此时热字串会恢复到下面的 SendPlay 模式 (它会遵循按键延迟).

SP (SendPlay): 默认延迟为零, 这对于 SendPlay 相当于 -1 (没有延迟). 此模式中, 这个延迟实际是 按住时长 而不是键击之间的延迟.

SE (SendEvent): 默认延迟为零. 在大多情况下建议使用零的延迟, 因为这样快速且与其他进程配合比较好 (由于会内部执行 Sleep 0). 指定 k-1 则不使用延迟, 这样可以在您 CPU 经常高负荷运行时让自动替换更快速地进行. 设置为 -1 时, 脚本的进程优先级会成为键击发送速度的重要因素. 要提升脚本的优先级,请使用 Process, Priority,, High。

O: 进行替换时忽略 自动替换热字串 的终止符. 它可以用于当您希望使用终止符让热字串保持清晰, 却不希望终止符显示在屏幕上的时候. 例如,如果 :o:ar::aristocrat 为热字串,那么输入“ar”后跟着空格键会产生不含尾随空格的“aristocrat”,这样可以让您在不需要退格的情况下补上单词的复数或所有格形式。使用 O0 (字母 O 后跟着零) 来关闭此选项.

Pn: 字符串的 优先级 (例如 P1). 这个非常少用的选项对 自动替换热字串 没有效果.

R: 发送原始的替换文本; 即准确地按照原样发送, 而不把 {Enter} 转换成 ENTER 键击, 把 ^c 转换成 Control-C, 等等. 此选项在含 延续片段 热字串中自动生效. 使用 R0 来关闭此选项.

SI、SP 或 SE [v1.0.43+]:设置自动替换热字串发送键击的方法。这些选项是互相排斥的: 每次只会有一个生效. 下面对每个选项进行说明:

SI 表示 SendInput, 它通常比其他模式拥有较好的速度和可靠性. 另一个好处是和下面的 SendPlay 一样, SendInput 会在热字串 自动替换文本 时会延迟您输入的内容. 这样避免了您的键击穿插到替换的内容中. 当 SendInput 不可用时, 热字串会自动使用 SendPlay.
SP 表示 SendPlay, 它可以让热字串运行在更大范围的游戏中.
SE 表示 SendEvent, 在比 1.0.43 早的版本中这是默认选项.

如果未使用上面的任何一个选项,则在v1.0.43及更高的版本中默认模式未sendinput 然而,与si 选项不同的是,在sendinput 不可用时会使用sendevent 而不是sendplay

Z 这个非常少用的选项会在每次热字串触发后重置热字串识别器,换句话说,脚本将开始等待全新的热字串,而不考虑您之前输入的任何内容,这可以避免意外地触发字符串,为了进行说明,请思考下面的字符串

1
2
3
:b0*?:11::
SendInput xx
return

由于上面没有使用 Z 选项, 所以输入 111 (三个连续的 1) 会触发热字串两次, 因为中间的 1 既是首次触发的 末尾 字符, 又是第二次触发的 起始 字符. 在 b0 前面加上字母 Z 后, 您必须输入四个 1 而不是三个才能触发热键两次. 使用 Z0 来关闭此选项.

超长替换

使用延续片段的方法可以让产生大量替换文本的热字串更具可读性和可维护性,例如

1
2
3
4
5
6
7
8
::text1::
(
Any text between the top and bottom parentheses is treated literally, including commas and percent signs.
By default, the hard carriage return (Enter) between the previous line and this one is also preserved.
By default, the indentation (tab) to the left of this line is preserved.

See continuation section for how to change these default behaviors.
)

使用延续片段后也会使热字串默认为原始模式,覆盖此特性的唯一方法是在每个含延续片段的热字串中指定 r0 选项 (例如 :r0:text1::)。

上下文相关的热字串

使用#ifwinactive/exist 指令可以让选择的热字串产生上下文相关性,这样的热字串会根据窗口是否活动或存在的不同情况发送不同的替换,执行不同的动作或什么都不做,例如

1
2
3
4
#IfWinActive ahk_class Notepad
::btw::This replacement text will appear only in Notepad.
#IfWinActive
::btw::This replacement text appears in windows other than Notepad.

自动更正

后面的脚本使用热字串及时更正大约4700常见的英文拼写错误,它还包含了win+H 热键来方便地添加更多拼写错误

备注

替换文本中当前不支持例如%MyVar%这样的变量引用,要解决此问题,请不要让这样的热字串自动替换,而是在缩写下面使用sendinput 命令,后跟着仅包含单词return 的行

要在替换文本后发送额外的空格或tab,可以把它们加在替换文本后,但需要在末尾加上重音符反引号,例如

1
:*:btw::By the way `

热字串助手

Andreas Borutta 推荐了下面额定脚本,如果您是深度的热字串用户,那么它会很有用,使用win+h 可以包当前选择的文本转变为热字串,

重映射按键和鼠标按钮

下面描述的autohotkey 重映射功能通常不如直接通过windows 注册表进行映射那么直接有效
对于每种方法的优点和缺点,请参阅注册表重映射

重映射键盘和鼠标

内置重映射功能的语法为 OriginKey::DestinationKey。例如, 只包含下面这行内容的 脚本 会将 “a” 键重映射成 “b” 键:

1
a::b

上面的例子没有改变 b 键自身的功能,b 键会继续发送b 的键击,除非把它重映射成其他功能,就像下面例子中演示的那样

上述例子中使用小写字母,在大多数情况下建议这么做,因为它也会映射相应的大写字母,
即在capslock 打开或shift 键被按住时会发送大写形式,与之相比,在右边使用大写字母会强制发送大写形式,
例如, 下面的代码行在您输入 “a” 或 “A” 时都会产生大写字母 B (只要 Capslock 是关闭的):

1
a::B

鼠标重映射 要映射鼠标,请使用和映射键盘相同的方法,例如

MButton::Shift 把鼠标中键映射成 Shift 键.
XButton1::LButton 把第四个鼠标按钮映射成鼠标左键.
RAlt::RButton 把右 Alt 映射成鼠标右键.

其他有用的映射

Capslock::Ctrl 把 Capslock 映射成 Control 键. 要保留打开和关闭 Capslock 的功能,还需添加重映射 +Capslock::Capslock(这样,当您按住 shift 键并按下 Capslock 后就可以切换 Capslock 的状态了)。
XButton2::^LButton 把第五个鼠标按钮 (XButton2) 映射成 Control-LeftClick.
RAlt::AppsKey 把右 Alt 键映射成 Apps 键 (这是打开上下文菜单的按键).
RCtrl::RWin 把右 Control 键映射成右 Windows 键.
Ctrl::Alt 把左右 Control 键映射成 Alt 键. 但是, 请参阅 alt-tab 的问题.
^x::^c 把 Control-X 映射成 Control-C. 它也会让 Control-Alt-X 产生 Control-Alt-C, 等等.
RWin::Return 让右 Windows 键简单地执行 return 来禁用它.

您可以尝试执行这里的每个例子,把它们复制到新文本文件,例如 remap.ahk 然后运行这个文件

请参阅按键列表,来了解按键和鼠标按钮名称的完整列表

备注

使用#ifwinactive/exist 指令可以让重映射仅在指定的窗口中有效,例如

1
2
3
#IfWinActive ahk_class Notepad
a::b ; 让 'a' 键到 'b' 键的映射仅在记事本中有效.
#IfWinActive ; 这里让后续的重映射和热键对所有窗口生效.

重映射按键和鼠标按钮在下面的关系中是完整的

按住修饰符 后按下原始键,会让那个修饰符对目标键生效,例如,b::a 会在您按下 control B 时产生controlA 的效果

capslock 通常会想普通键那样影响重映射的按键

按住目标键或按钮的时间和您持续按住原始键的时间一样长,但是,一些游戏不支持重映射,此时,键盘和鼠标的重映射没有效果

按住被重映射的按键时,它们的目标键好自动重复,除非是把按键重映射为鼠标按键

尽管被重映射的按键可以触发普通热键,但默认情况下它不能触发鼠标热键或钩子热键,请使用listhotkey 来找出来哪些热键使用了钩子,例如,如果重映射a::b 有效,那么按下 ctrl alt a 会触发 ^!b 热键,但仅在^!b 不是钩子热键的时候,如果^!b 是钩子热键,而且您希望使用ctrl-alt-a 来执行ctrl-alt-b 相同的动作,那么您可以把^!a 定义为热键,例如

1
2
3
4
5
a::b
^!a::
^!b::
ToolTip You pressed %A_ThisHotkey%.
return

在1.1.06及更高版本中,还可使用#inputlevel 来覆盖此默认行为,例如

1
2
3
4
5
6
7
#InputLevel 1
a::b

#InputLevel 0
^!b::
ToolTip You pressed %A_ThisHotkey%.
return

如果在自动运行段,脚本的顶部使用了sendmode 那么它会影响所有的重映射,但是,由于重映射使用send {build} 而sendplay 模式不完全支持build,所以一些映射在sendplay 模式中可能无法正常运行,尤其是control shift alt 和win 要变通解决此问题,当您脚本中含有重映射时请避免在自动执行段中使用sendplay 而仅在整个脚本的一些需要的地方使用sendplay 命令而不是send . 或者, 您可以包您的重映射转换为热键,如下所述,这样就明确调用sendevent 而不是send

加载脚本时,每个重映射会被转换为一对热键,例如,包含重映射a::b 的脚本实际包含下面的两个热键

1
2
3
4
5
6
7
8
9
*a::
SetKeyDelay -1 ; 如果目标键是鼠标按钮, 则使用 SetMouseDelay 代替.
Send {Blind}{b DownTemp} ; DownTemp 和 Down 相似, 不过使用 DownTemp 时脚本中后面的其他 Send 命令则不会假定 "b" 仍然处于按下的状态.
return

*a up::
SetKeyDelay -1 ; 请参阅下面的注意事项来了解在这段代码中两处 SetKeyDelay 都没有指定按键时长的原因.
Send {Blind}{b Up}
return

但是,上面的两个热键在下列环境中会发生变化

  1. 当原始键为lctrl 而目标见为alt 键时会把send {build}{lalt downtemp}这行语句替换为Send {Blind}{LCtrl Up}{LAlt DownTemp} 如果原始键为rctrl 也会如此,除非使用了{rctrl up}

  2. 当键盘按键被重映射为鼠标按钮时,例如 rctrl::rbutton 在上面的热键中会使用setmousedelay 代替 setkeydelay 而且,上面的首个热键会被替换为下面的热键,这样避免了由于键盘的自动重复功能生成的重复的鼠标点击

1
2
3
4
5
*RCtrl::
SetMouseDelay -1
if not GetKeyState("RButton") ; 即鼠标右键还没有按下.
Send {Blind}{RButton DownTemp}
return

请注意在上面的热键中省略了setkeydelay 的第二个参数 按键时长,这是因为按键时长不适用于独立的按键按下或按键弹起事件例如{b down}{b up}但是,它适用于 shift ctrl alt win 按键状态的改变,这会影响像a::B 或a::^b 的重映射,因此,脚本中任何在自动执行段生效的按键时长会应用于所有这类重映射

尽管一对按键不能直接重映射为单个按键,例如a&c::b是无效的,不过只需要在前面的示例中添加明确的弹起和按下热键即可实现这种行为,简单地把*a:: 替换为a&c:: 且把*a up:: 替换为a&c up::

由于重映射会被简单翻译为上面描述的热键,所以,suspend 也会影响它们,同样地hotkey 命令可以禁用或修改重映射,例如,下面的两个命令会禁用重映射 a::b

1
2
Hotkey, *a, off
Hotkey, *a up, off

alt-tab 的问题,如果您把一个按键或鼠标按键映射为alt 键,那么这个键很可能无法正确实现alt-tab的功能,一个可能得变通解决方法是添加热键*Tab::Send {Blind}{Tab} ,但是需要注意这样很可能妨碍使用真正的alt 实现alt-tab 的功能,因此,这种方法只应用于在您希望单独使用重映射的按键和 alt-tab 热键实现alt-tab 功能的时候

除了按键列表页面中的按键和鼠标按钮,原始键还可以是在特殊按键页面描述的虚拟键 vknn 或扫描码 scnnn 对于目标键同样如此,不过它还可以再虚拟键后指定扫描码,例如,在大多数键盘布局中sc01e::vk42sc030相当于a::b

要禁用按键而不进行重映射,请把它设置为只含有return的热键,F1::return 会禁用F1键

内置的重映射键功能不支持下列按键

鼠标滚轮
wheelup down left right

pause 和break 不能作为目标键,因为它们会被作为命令执行

大括号{} 不能作为目标见,作为替代请使用vksc 方法例如x::+sc01A 和 y::+sc01B
百分号%不能作为目标见,作为替代请使用vksc 方法

return 不能作为目标键,作为替代请使用enter

通过键盘移动鼠标光标

如同在全功能键盘到鼠标的映射脚本中演示的那样,可以使用键盘来移动鼠标光标,由于这个脚本提供了鼠标平滑移动, 加速和其他功能, 所以如果您想使用键盘实现许多的鼠标操作, 推荐您使用这个脚本.

使用注册表的“扫描码映射”功能进行重映射

优点

注册表的重映射功能通常比 autohotkey 的重映射更加直接有效,例如,它能适应于更大范围的游戏,它不存在alt-tab 问题,并且它能触发autohotkey 的钩子热键,然而 autohotkey 的重映射需要间接的方法才行

如果您会手动修改注册表条目 (下面进行阐述), 那么不需要任何外部软件就可以重映射您的键盘. 即使您使用 KeyTweak 来修改注册表条目, 那么完成后 KeyTweak 不需要一直保持运行 (而 AutoHotkey 需要一直运行, 重映射才会生效).
缺点:

注册表重映射比较不灵活: 每次修改映射都必须重启后才会生效.
效果是全局的: 它不能创建针对特定用户, 应用程序或环境的重映射.
它无法发送含修饰键 Shift, Control, Alt 或 AltGr 的组合键. 例如,它不能把小写字符映射为大写字符。
它只支持键盘 (AutoHotkey 还支持 鼠标重映射 和一些 受限的操纵杆重映射).
如何修改注册表: 使用注册表重映射按键至少有两种方法:

使用像 KeyTweak (免费软件) 这样的程序在可视界面中重映射按键. 它会自动修改注册表.
手动创建重映射按键的 .reg 文件 (纯文本) 并把它载入注册表. 演示的例子请参阅 www.autohotkey.com/forum/post-56216.html#56216

按键列表

鼠标键盘

注意: 字母和数字按键的名称和单个字母或数字相同. 例如: b 表示 “b” 键而 5 表示 “5” 键.

概述
CapsLock 大小写锁定键
Space 空格键
Tab Tab 键
Enter (或 Return) 回车键
Escape (或 Esc) 退出键
Backspace (或 BS) 退格键
光标控制
ScrollLock 滚动锁定键
Delete (或 Del) 删除键
Insert (或 Ins) 插入改写切换键
Home Home 键
End End 键
PgUp 向上翻页键
PgDn 向下翻页键
Up 向上方向键
Down 向下方向键
Left 向左方向键
Right 向右方向键
Numpad
NumLock 开启 NumLock 关闭
Numpad0 NumpadIns0 / 插入改写切换键
Numpad1 NumpadEnd1 / End 键
Numpad2 NumpadDown2 / 向下方向键
Numpad3 NumpadPgDn3 / 向下翻页键
Numpad4 NumpadLeft4 / 向左方向键
Numpad5 NumpadClear5 / 通常什么都不做
Numpad6 NumpadRight6 / 向右方向键
Numpad7 NumpadHome7 / Home 键
Numpad8 NumpadUp8 / 向上方向键
Numpad9 NumpadPgUp9 / 向上翻页键
NumpadDot NumpadDel十进制分隔符 / 删除键
NumpadDiv NumpadDiv除
NumpadMult NumpadMult乘
NumpadAdd NumpadAdd加
NumpadSub NumpadSub减
NumpadEnter NumpadEnter回车键
功能
F1 - F24 在大多数键盘顶部的 12 个或更多的功能键。
按键修饰符
LWin 左边的 Windows 徽标键。对应的热键前缀为 <#
RWin 右边的 Windows 徽标键。对应的热键前缀为 >#。 注意:与 Control/Alt/Shift 不同,没有一般的/中性的“Win”键,因为操作系统不支持。不过含 # 修饰符的热键可以被任何一个 Win 键触发。
Control (或 Ctrl) Control 键。单独作为热键(Control::)时它在弹起时触发,不过如果加上颚化符前缀可以改变这种情况。对应的热键前缀为 ^
Alt Alt 键。单独作为热键(Alt::)时它在弹起时触发,不过如果加上颚化符前缀可以改变这种情况。对应的热键前缀为 !
Shift Shift 键。单独作为热键(Shift::)时它在弹起时触发,不过如果加上颚化符前缀可以改变这种情况。对应的热键前缀为 +
LControl(或 LCtrl) 左 Control 键。对应的热键前缀为 <^
RControl(或 RCtrl) 右 Control 键。对应的热键前缀为 >^
LShift 左 Shift 键。对应的热键前缀为 <+
RShift 右 Shift 键。对应的热键前缀为 >+
LAlt 左 Alt 键。对应的热键前缀为 <!
RAlt 右 Alt 键。对应的热键前缀为 >!。 注意:如果您的键盘布局存在 AltGr 而不是 RAlt,那么您完全可以根据这里描述的那样通过 <^>! 把它作为热键前缀使用。此外,LControl & RAlt:: 可以把 AltGr 自身设置成热键。
多媒体
Browser_Back 后退
Browser_Forward 前进
Browser_Refresh 刷新
Browser_Stop 停止
Browser_Search 搜索
Browser_Favorites 收藏夹
Browser_Home 主页
Volume_Mute 静音
Volume_Down 调低音量
Volume_Up 增加音量
Media_Next 下一首
Media_Prev 上一首
Media_Stop 停止
Media_Play_Pause Play/Pause
Launch_Mail 打开默认的电子邮件程序
Launch_Media 打开默认的媒体播放器
Launch_App1 打开我的电脑
Launch_App2 打开计算器
注:上面列出的每个按键的功能可以通过修改 Windows 注册表进行替换。这个表格中显示的是在 Windows 系统的大多数版本中每个按键的默认功能。
特别
AppsKey 菜单键。这是调用右键上下文菜单的按键。
PrintScreen 捕获屏幕
CtrlBreak
暂停 暂停键
中断 中断键。由于此键和 Pause 含义相同,所以在热键中请使用 ^CtrlBreak 代替 ^Pause^Break
帮助 帮助键。此键可能在大多数键盘上不存在。它通常和 F1 不同.
Sleep 休眠键。注意在一些键盘上的 sleep 键可能不是休眠功能。
SCnnn 请在 nnn 中指定按键的扫描码。识别上面没有提到的罕见的按键。请参阅特殊按键了解详情。
VKnn 请在 nn 中指定十六进制的虚拟按键码。这种极少用的方法还可以避免某些类型的热键需要安装键盘钩子。例如,后面的热键不使用键盘钩子,但副作用是它会在按下 Home 或 NumpadHome 的其中一个时触发:^VK24::MsgBox You pressed Home or NumpadHome while holding down Control. 已知限制:强制使用键盘钩子的 VK 热键,例如 *VK24~VK24,只会触发其中一个热键,而不会触发两者(例如触发 NumpadHome 但不触发 Home)。关于 VKnn 方法的更多细节,请参阅特殊按键

操纵杆

尽管下列操纵杆控制器的名称不能设为热键, 但它们可以用于 GetKeyState:
JoyX, JoyY 和 JoyZ: 操纵杆的 X (水平), Y (垂直) 和 Z (高度/深度) 轴.
JoyR: 操纵杆的方向舵或第 4 轴.
JoyU 和 JoyV: 操纵杆的第 5 和第 6 轴.
JoyPOV: 视点 (帽) 控制器.
JoyName: 操纵杆或其驱动的名称.
JoyButtons: 操纵杆支持的按钮数 (不总是准确的).
JoyAxes: 操纵杆支持的轴数.
JoyInfo: 提供由零个或多个后面的字母组成的字符串, 这些字母表示操纵杆的功能: Z (有 Z 轴), R (有 R 轴), U (有 U 轴), V (有 V 轴), P (有 POV 控制器), D (POV 控制器有少数离散的/不同的设置), C (POV 控制器是连续的/良好的). 示例字符串: ZRUVPD

多个操纵杆: 如果计算机上有多个操纵杆并且您想使用第一个外的其他操纵杆, 那么请在控制器名称的前面加上操纵杆的编号 (最大为 16). 例如, 2joy1 表示第二个操纵杆的首个按钮.

注意: 如果您在使用脚本识别您的操纵杆时遇到问题, 曾有人报告说尽管只有一个操纵杆却需要指定大于 1 的操纵杆编号. 不清楚这种方法是如何得到的或是否正常, 不过请尝试在 操纵杆测试脚本 中使用操纵杆编号也许可以帮助确定这种方法是否适合您的系统.

另请参阅:
操纵杆重映射: 使用操纵杆发送键击和鼠标点击的方法.
操纵杆到鼠标的映射脚本: 把操纵杆作为鼠标使用.

手持遥控

特殊按键

如果您的键盘或鼠标含有前面没有列出的按键,那么使用下列步骤后您仍可能把它设为热键

确保至少有一个使用键盘钩子的脚本正在运行,打开脚本的

双击脚本的托盘图标来打开其主窗口.
按下您键盘上的其中一个 “神秘按键”.
选择菜单项 “View->Key history”
向下滚动到页面的底部. 在底部附近的某个地方可以看到您按键的按下和弹起事件. 注: 一些按键不生成事件, 因此这里看不到它们的事件. 如果是这种情况, 那么您不能直接把此特殊按键设为热键, 因为您的键盘驱动或硬件在很低的 AutoHotkey 无法访问的层面处理它. 要得到可能的解决方法, 请参阅较远的后面.
如果检测到了您的按键, 请记下列表中第二列的 3 位十六进制值 (例如 159).
要把此键定义为热键, 请参照此例:

1
2
3
SC159:: ; 把 159 替换为您按键的值.
MsgBox, %A_ThisHotKey% was pressed.
return

反向: 要把其他键重映射 为 “神秘按键”, 请参照此例:

1
2
3
; 把 159 替换为上面找到的值. 把FF(如果需要)替换为
; 按键的虚拟键,它可以在按键历史页面的首列找到。
#c::Send {vkFFsc159}

可选的解决方案,如果您的按键或鼠标按钮没有在按键历史页面检测到,那么下面的其中一种方法可能有帮助

重新配置您鼠标或键盘的附带软件,有时可以在控制面板或开始菜单中访问,来让神秘按键发送其他的键击,然后可以在脚本中把这样的键击设置为热键, 例如,如果您配置神秘按键来发送 Control+F1,然后在脚本中通过使用 ^F1:: 您可以把这个按键间接的设置为热键。

试试 DllCall: 对人体学输入设备的支持. 您还可以在 论坛 中搜索类似 RawInput* 的关键字.

下面是最后的手段, 通常应该在其他所有方法都无效时才去尝试. 这是由于成功的机会很小且可能会引起难以取消的不必要的副作用.
禁用或移除您键盘或鼠标的附带软件, 或者让它使用更标准的驱动, 例如操作系统内置的那个. 这里假设您特殊的键盘或鼠标使用自己的驱动并且您不使用其自带驱动和软件提供的功能.

脚本

简介
脚本顶部
转义序列
在脚本中添加注释
包过长的行分割成一系列短行
把脚本转换成exe
向脚本传递命令行参数
脚本文件代码页

调试脚本
autohotkey 的可移植性
安装程序选项

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
; 示例 #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 个字符。例如,Joins 会在除最后一行外的每行末尾插入一个空格(“s”表示原义的空格,这是一个只能被 *Join* 识别的特殊转义序列)。另一个例子是 Joinrn,它会在行与行之间插入 CR+LF。同样地,Join|` 会在行之间插入管道符。要让延续片段的最后一行也以连接字符串结尾, 需要在它的闭括号上一行添加一个空行.

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

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

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

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

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

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

) [v1.1.01+]: 如果在延续片段的选项中使用闭括号 (不是作为 Join 选项的参数), 那么此行被重新解释为表达式而不是延续片段的开始. 这样可以让像 (x.y)[z]() 这样的表达式可以在不需要对开括号进行转义的情况下也有效.

使用 Ahk2Exe 有下列几种方式:

GUI 界面: 运行菜单菜单中的 “Convert .ahk to .exe” 菜单项.
右键点击: 在资源管理器中, 您可以在任何一个 .ahk 上右键点击并选择 “Compile Script” (只有在安装 AutoHotkey 时选择了脚本编译器时时才可用). 这样创建了与脚本具有相同的主文件名的 EXE 文件, 它会在稍后出现在相同目录中. 注: 这样生成的 EXE 文件会使用与前面的方法 #1 最后一次使用时相同的自定义图标, .bin 文件以及 MPRESS 设置.
命令行: 编译器可以使用下列参数在命令行中运行:
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 选项.
如果在 AutoHotkey 安装目录的 “Compiler” 子文件夹中含有 mpress.exe, 则会使用它压缩脚本的可执行文件, 除非通过 /mpress 0 或 GUI 设置把它禁用了. 这样同时压缩了脚本的源代码 (删除了所有注释), 其中的源码可以使用 PE 资源编辑器从可执行文件中提取.
命令 #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+]

变量

变量的类型

autohotkey 中没有明确的变量类型,然而,只包含数字的变量进行数学运算或比较时,会被自动转换为数值,为了提高性能,在内部会对数字进行缓存以避免与字符串之间的转换

变量的作用域和声明

除了函数中的局部变量,其他所有变量都是全局的,即可以在脚本的任意位置读取或修改它们的内容,除了在函数页面注明的情况,变量都是不需要声明的,使用它们的时候它们就产生了 每个变量初始为空

变量的名称
变量名不区分大小写,变量名可以含有多达253 个字符,并且可以由字母,数字以及后面的标点组成 #_@$

考虑到命名的惯例,通常在命名变量时最好仅使用字母,数字,和下划线 这样的风格可以让熟悉其他计算机语言的人更容易理解您的脚本,而且,如果您在autohotkey 和其他语言中使用相同的风格,您会发现能更容易读懂自己的脚本

尽管变量名可以完全由数字组成,但通常这样的名称仅用于 传入的命令行参数,这样数值名称的变量不能用在表达式中,因为它们会被看成是数字而不是变量

因为单词 and or 和not 作为表达式的运算符使用,所以通常不应该把它们用作变量名称,在表达式中使用这样的名称会无法正确计算

给变量赋值,要把字符串或数字保存到变量中,由两种方法,传统方法和表达式方法,传统方法使用等号运算符= 来指定没有加引号的,原义字符串或包围在百分号中的变量,例如

1
2
3
MyNumber = 123
MyString = This is a literal string.
CopyOfVar = %Var% ; 和 = 运算符一起使用时, 需要使用百分号来获取变量的内容.

与之相比,表达式方法使用 冒号等号运算符 来保存数字,加引号的字符串和其他类型的表达式,下面的例子在功能与前面的例子相同

1
2
3
MyNumber := 123
MyString := "This is a literal string."
CopyOfVar := Var ; 和前面段落中与其作用相同的语句不同, 百分号不和 := 运算符一起使用.

后一种方法由于其更清晰并且与其他许多语言几乎一致的表达式语法 成为大多数人的首选方法

从上面的例子中您可能已经想到了有两种方法来清除变量的内容 即让变量为空

1
2
MyVar =
MyVar := ""

上面的这对空引号只能和:= 运算符一起使用,因为和= 运算符一起使用时,则会在变量中保存两个原义的引号字符

获取变量的内容

如同赋值有两种方法,获取变量的内容也有两种方法,传统方法和表达式方法,传统方法需要将变量名包围在百分号来获取变量的内容,例如

1
2
MsgBox The value in the variable named Var is %Var%.
CopyOfVar = %Var%

与之相比,表达式方法省去了变量名两边的百分号,但原义的字符串必须包围在双引号中,所以,下面的表达式作用等同于上面的例子

1
2
MsgBox % "The value in the variable named Var is " . Var . "."  ; 使用句点连接两个字符串.
CopyOfVar := Var

从上面的msgbox 这行,, 通过使用百分号和空格把参数从传统模式改变为表达式模式. 因为所有的命令默认情况下使用传统模式 (除了另外注明的那些), 所以这是必须的. 不过, 某些命令的特定参数已注明接受表达式, 此时前导的百分号可以省略. 例如, 下面的所有语句都是等效的, 因为 Sleep 的首个参数可以是表达式:

1
2
3
Sleep MillisecondsToWait
Sleep %MillisecondsToWait%
Sleep % MillisecondsToWait

变量的比较,请阅读下面表达式部分中关于不同类型变量比较的重要提示,尤其是关于何时使用小括号的内容

表达式

表达式用来对一系列变量,原义字符串 或原义数字执行一个或多个操作

表达式中的变量名称不用包围在百分号中,伪数组和其他的双重引用除外,所以,为了与变量区别 原义的字符串必须用双引号包围
例如

1
2
if (CurrentSetting > 100 or FoundColor <> "Blue")
MsgBox The setting is too high or the wrong color is present.

在上面的例子中,因为blue 是原义字符串,所以包围在双引号中,要在原义字符串中包含真实的引号字符,请指定两个连续的引号

如同此例中的两次演示:”She said, “”An apple a day.”””。

重要说明:含有表达式的 if 语句与传统的 if 语句(例如 If FoundColor <> Blue),可以通过单词“if”后是否有开括号来区分。尽管通常把整个表达式包围在括号中,不过也可以写成这样:if (x > 0) and (y > 0)。此外, 如果单词 “if” 后的第一项为 函数调用 或类似 “not” 或 “!” 这样的运算符时, 开括号可以完全省略.

空字符串: 要在表达式中使用空字符串, 请指定一对空引号. 例如,当 MyVar 非空时语句 if (MyVar <> "") 的结果为真。然而, 在 传统 if 语句 中, 一对空引号会被视为原义的字符串. 例如,当 MyVar 仅包含一对真实的引号时语句 if MyVar = "" 结果为真。因此,要使用传统的 if 语句判断变量是否为空,则需要让 = 或 <> 的右侧为空,例如:if Var =

相关提示,任何无效的表达式例如 (x +* 3) 会产生空字符串。

保存表达式的结果: 要把结果赋值给变量, 请使用 := 运算符. 例如:

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

布尔值: 要计算表达式结果为真还是假时 (例如 IF 语句), 表达式结果为空或零被视为假, 而其他所有结果都视为真. 例如,仅当 ItemCount 为空或 0 时 if ItemCount 的结果才为假。类似地,表达式 if not ItemCount 将产生相反的结果。

像 NOT/AND/OR/>/=/< 这些运算符的运算会自动产生真值或假值的结果: 真值时结果为 1 而假值时为 0. 例如, 在下面的表达式中, 如果有一个条件为真则变量 Done 被赋值为 1:

1
Done := A_Index > 5 or FoundIt

如上面提示的那样, 简单地置空变量或为其赋值为 0 可以让它假值. 利用这种特性,可以使用简写语句 if Done 来检查变量 Done 是真还是假。

单词 truefalse 是值分别为 1 和 0 的内置变量. 使用它们可以增加脚本的可读性, 例如:

1
2
CaseSensitive := false
ContinueSearch := true

整数和浮点数: 在表达式中, 含有小数点的数字被视为浮点数; 否则视为整数. 对于大多数运算符(例如加法和乘法),只要其中的一个输入是浮点数,那么结果也将是浮点数。

不论在表达式中还是在表达式外的其他地方, 整数都可以表示成十六进制或十进制. 十六进制数必须以前缀 0x 开头. 例如,Sleep 0xFF 等同于 Sleep 255。在 v1.0.46.11+,可以识别用科学计数法表示的浮点数;但只有在它们含有小数点时才行(例如 1**.**0e4-2**.**1E-4)。

强制使用表达式: 通过在表达式前加上百分号和空格或 tab, 能把表达式用在不直接支持表达式的参数中 (除了像 StringLen 的 OutputVar 和 InputVar 的那些参数). 这种技巧常用来访问 数组. 例如:

1
2
3
4
5
FileAppend, % MyArray%i%, My File.txt
MsgBox % "The variable MyVar contains " . MyVar . "."
Loop % Iterations + 1
WinSet, Transparent, % X + 100
Control, Choose, % CurrentSelection - 1

表达式中的运算符

除了下面注明的情况, 其他时候在数学运算中包含的任何空值 (空字符串) 都 不会 被假定为零. 作为替代, 它会被视为错误, 这将导致那部分表达式的计算结果为空字符串. 例如, 如果变量 X 为空, 那么表达式 X+1 会产生空值而不是 1.

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2015-2024 TeX_baitu
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~