热键有时也称为快捷键, 因为它们能简便地触发动作 (例如运行程序或 键盘宏). 在下面的例子中, Win+N 被设置为启动记事本. 磅的符号 [#] 表示 Windows 键, 它被称为 修饰符:
#n:: Run Notepad return
在前面的最后一行中,return 用来结束此热键.不过, 如果热键只需要执行单行语句, 那么此行可以直接放在双冒号的右边. 换句话说,return 可以省略:
#n::Run Notepad
要在热键中使用多个修饰键, 那么需要把它们连续地列出来 (顺序无关紧要). 下面的例子中使用 ^!s 来表示 Control+Alt+S:
^!s:: Send Sincerely,{enter}John Smith ; 此行发送键击到活动 (最前面的) 窗口. return
在定义热键时您可以使用下列修饰符:
| 符号 | 说明 |
|---|---|
| # | Win (Windows 徽标键). 在 v1.0.48.01+, 对于 Windows Vista 及以上版本, 包含 Windows 键的热键 (例如 #a) 会等待 Windows 键被释放后才发送任何包含 "L" 键击的文本. 这样避免了这种热键中的 Send 锁定 PC.这种行为适用于除 SendPlay (这里不需要) 和 盲从模式 外的所有发送模式. |
| ! | Alt |
| ^ | Control |
| + | Shift |
| & | 和符号可以用来组合任意两个按键或鼠标按钮, 让它们成为自定义热键. 请参阅 后面 了解详情. |
| < | 使用成对按键中左边的那个. 例如 <!a 相当于 !a, 只是使用左边的 Alt 键才可以触发. |
| > | 使用成对按键中右边的那个. |
| <^>! | AltGr (alternate graving). 如果您键盘布局中含 AltGr 键而非右 Alt 键,那么这一系列符号一般可用于表示 AltGr.例如: <^>!m::MsgBox You pressed AltGr+m. <^<!m::MsgBox You pressed LeftControl+LeftAlt+m. 或者, 让 AltGr 自己成为热键, 请使用下面的热键 (不像上面出现的任何热键): LControl & RAlt::MsgBox You pressed AltGr itself. |
| * | 通配符: 即使附加的修饰键被按住也能激发热键. 这常与 重映射 按键或按钮组合使用. 例如: *#c::Run Calc.exe ; Win+C,Shift+Win+C,Ctrl+Win+C 等都会触发此热键. *ScrollLock::Run Notepad ; 即使在按住其他修饰键时按下 ScrollLock 也会触发此热键. |
| ~ | 激发热键时,不会屏蔽(被操作系统隐藏)热键中按键原有的功能.在下面的两个例子中, 用户的鼠标按钮点击会被发送到活动窗口: ~RButton::MsgBox You clicked the right mouse button. ~RButton & C::MsgBox You pressed C while holding down the right mouse button. 与其他前缀符号不同,可以在某些热键的 变体 中使用波浪号前缀而其他的不使用. 然而,如果应用于波浪号 前缀 的任何自定义组合键没有被关闭或暂停,它会影响那个前缀键在 所有 组合中的行为. 用于替代 alt-tab 的特殊按键总是忽略波浪号前缀. [v1.1.14+]: 如果把波浪号 (前缀键) 用在自定义修饰键中且此修饰键自身也作为热键,则在按下此修饰键时会触发热键而不会被延迟到按键释放的时候.例如,上文中 ~RButton 热键在按下此按键时就会触发.对于 v1.1.14 之前的版本(或未使用波浪号前缀), 则会在按键释放时触发其自身的热键, 不过仅在未触发 RButton & C 组合键的时候. 如果波浪号前缀应用于自定义组合而非不可组合键, 按键的原生功能将持续锁定. 例如, 下面的脚本, 按住 AppsKey 键将会一直显示一个 ToolTip 而不会触发上下文菜单: AppsKey::ToolTip Press < or > to cycle through windows.
AppsKey Up::ToolTip
~AppsKey & <::Send !+{Esc}
~AppsKey & >::Send !{Esc} |
| $ | 通常只在脚本使用 Send 命令发送包含了热键自身的按键时才需要使用此符号, 此时可以避免触发它自己. $ 前缀强制使用 键盘钩子 来实现此热键, 作为一个副作用这样避免了 Send 命令触发它自己. $ 前缀相当于在此热键定义之前的某个位置指定了 $ 前缀对于鼠标热键不起作用, 因为它们始终使用鼠标钩子. 它对于已经启用了键盘钩子的热键同样无效, 包括所有与 波浪号 (~) 或 通配符 (*) 搭配的修改器, key-up 热键 以及自定义组合. [v1.1.06+]: #InputLevel 和 SendLevel 对 Send 命令是否触发热键和热字串提供了额外的控制功能. |
| UP | 单词 UP 可以跟在热键名后面使得在释放按键时触发热键, 而不是按下时. 下面的例子把 LWin 重映射 为 LControl: *LWin::Send {LControl Down}
*LWin Up::Send {LControl Up}
"Up"也可以用于普通热键中,例如: 限制:1) "Up" 不能和 游戏杆按钮 一起使用;2) 在没有普通/按下热键副本的 "Up" 热键会完全接管那个按键以防被卡住.避免这种情况的一种方法是添加波浪号前缀(例如 相关提示, 类似于上面的一种技术是让热键成为前缀键. 好处是尽管热键会在按键松开时激发, 但仅在您之前按住此前缀键时没有按其他任何键的情况下才会如此. 例如: LControl & F1::return ; 通过把左 control 键放在 "&" 前面至少一次来让它成为前缀键.
LControl::MsgBox You released LControl without having used it to modify any other key. |
(请参阅 按键列表 来了解键盘按键和鼠标/操纵杆按钮的完整列表)
多个热键可以垂直地叠放来让它们执行相同的动作. 例如:
^Numpad0:: ^Numpad1:: MsgBox Pressing either Control+Numpad0 or Control+Numpad1 will display this message. return
通过不为按键或按键组合的热键指定任何操作可以在整个系统中完全禁用它们. 下面的例子中禁用了右 Windows 键:
RWin::return
上下文相关的热键
#IfWinActive/Exist 和 #If 指令可以用来让热键根据不同的条件执行不同的动作 (或什么都不做). 例如:
#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 接着按下第二个按键时会触发此热键:
Numpad0 & Numpad1::MsgBox You pressed Numpad1 while holding down Numpad0. Numpad0 & Numpad2::Run Notepad
前缀键导致失去它原有的功能: 在上面的例子中, Numpad0 成为 前缀键; 但是这也让 Numpad0 在被按下时失去了它原有的功能. 为了避免此问题, 脚本中可以配置 Numpad0 执行新的动作, 例如下列热键的其中一个:
Numpad0::WinMaximize A ; 最大化活动/前端窗口. Numpad0::Send {Numpad0} ; 让 Numpad0 释放 时产生 Numpad0 键击. 请参阅下面的注释.
释放时触发: 使用上面的其中一个自定义组合热键可以在 释放 Numpad0 时执行指定的动作, 但不包括按住 Numpad0 时您又按下了其他按键的情况. 从 v1.1.14+ 开始,可以在其中某个热键前使用 波浪号前缀 来避免这种行为.
修饰: 与普通热键不同的是, 自定义组合在默认情况下表现得就像拥有一个 通配符 (*) 修饰一样. 例如, 1 & 2:: 无论 Ctrl 或 Alt 是否被按住都会触发, 然而 ^1:: 仅在 Ctrl+1 组合键时触发,而 Ctrl+Alt+1 不会触发.
对于普通的修饰键, 一般的热键会比 "自定义" 组合工作得更好. 例如, <+s:: 就是比 LShift & s:: 更好的用法.
不支持组合三个或更多的键. 一般来说组合键支持你键盘上物理存在的所有按键,都可以用 #If 和 GetKeyState 探测状态, 但是也可能出现不一致的情况. 例如:
; 以任何顺序按下 AppsKey 和 Alt , 然后按下反斜杠键 (/). #if GetKeyState("AppsKey", "P") Alt & /::MsgBox Hotkey activated. ; 如果对调 AppsKey 和 Alt, 则必须先按下 Alt (一次按一个): #if GetKeyState("Alt", "P") AppsKey & /::MsgBox Hotkey activated. ; 同时按下这三个键: [ & ] & \:: #if GetKeyState("[") && GetKeyState("]") \::MsgBox
其他功能
Numlock, Capslock 和 Scrolllock: 这些键可以被强制设置为 "AlwaysOn" 或 "AlwaysOff". 例如:SetNumlockState AlwaysOn.
覆盖资源管理器热键: 在脚本中可以为 Windows 内置的热键例如 Win-E (#e) 和 Win-R (#r) 指定一个动作来个别的替换. 请参阅 覆盖页面 了解详情.
替换 Alt-Tab: 热键可以提供 Alt-Tab 切换窗口的可选方法. 例如, 下面的两个热键可以让您用右手进行 alt-tab:
RControl & RShift::AltTab ; 按住右 control 后接着反复下右 shift 来向前移动. RControl & Enter::ShiftAltTab ; 甚至不需要释放右 control, 直接按 Enter 来反向移动.
想了解更多细节, 请参阅 Alt-Tab.
鼠标滚轮热键
通过键名 WheelDown 和 WheelUp 可以支持转动滚轮来激发热键. 在 v1.0.48+ 中还支持 WheelLeft 和 WheelRight,但在早于 Windows Vista 的操作系统上没有效果.这里是一些鼠标滚轮热键的例子:
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 键并转动滚轮时进行水平滚动而不是垂直滚动:
~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 的状态如何都运行相同的子程序. 例如:
NumpadEnd:: Numpad1:: MsgBox, This hotkey is launched regardless of whether Numlock is on. return
如果 波浪号 (~) 和 前缀键 一起使用, 即使只是一次, 那么其中的前缀键总是会被发送到活动窗口. 例如, 在下面的两个热键中, 活动窗口都会接收到右键点击, 尽管只是其中一个热键使用了波浪号:
~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 来模仿这种效果, 如下所示:
Joy2::
if not GetKeyState("Control") ; 左边和右边的 Control 键都没有按下.
return ; 即什么都不做.
MsgBox You pressed the first joystick's second button while holding down the Control key.
return
如果热键应该在继续执行前等待其修饰键被释放, 这可能需要一些时间. 请参考下面的例子:
^!s::Send {Delete}
按下 Control-Alt-S 会让系统以为您按下了 Control-Alt-Delete (由于系统对 Ctrl-Alt-Delete 的侵略性检测). 要变通解决此问题, 请使用 KeyWait 来等待按键释放; 例如:
^!s::
KeyWait Control
KeyWait Alt
Send {Delete}
return
如果像 #z:: 这样的热键标签产生了类似"无效热键"的错误,那么您的系统键盘布局/语言可能不包含特殊字符(此时为"Z").尝试使用您键盘布局中您知道的其他字符.
热键标签可以作为 Gosub 或 Goto 的目标. 例如:Gosub ^!s.
热键的一个常见用途是启动和停止重复的动作, 例如一系列的键击或鼠标点击. 关于这方面的例子, 请参阅 这个 FAQ 主题.
最后, 每个脚本都是 准多线程的, 这样可以在之前的热键子程序还在运行时启动新的热键. 例如, 即使在当前热键显示 MsgBox 时也能启动新热键.
Alt-Tab 热键
每个 Alt-Tab 热键必须是两个键的组合, 通常通过和符号 (&) 实现. 在下面的例子中, 按住右 Alt 键并按下 J 或 K 可以导航 alt-tab 菜单:
RAlt & j::AltTab RAlt & k::ShiftAltTab
AltTab 和 ShiftAltTab 是两个特殊的命令, 它们仅在与热键在同一行时才能被识别. 这里是完整的列表:
AltTab: 如果 alt-tab 菜单可见, 那么在菜单中前移. 否则, 显示菜单 (仅当热键为由 "&" 连接的两个按键时; 否则, 它什么都不做).
ShiftAltTab: 与上面相同, 不过这里在菜单中后移.
AltTabAndMenu:如果 alt-tab 菜单可见,那么在菜单中前移.否则, 显示菜单.
AltTabMenuDismiss: 关闭 Alt-tab 菜单.
为了举例说明上述命令, 可以用鼠标滚轮完全代替 Alt-tab. 当下面的热键生效时, 点击鼠标中键显示菜单, 转动滚轮在菜单中导航:
MButton::AltTabMenu WheelDown::AltTab WheelUp::ShiftAltTab
要取消热键调用的 Alt-tab 菜单而不激活选择的窗口, 请使用类似下面这样的热键:它可能需要根据后面的这些进行调整: 1) 最初显示 alt-tab 菜单的方法; 和 2) 脚本是否安装了 键盘钩子.
LCtrl & CapsLock::AltTab !MButton:: ; 鼠标中键. ! 前缀让它在按住 Alt 键时激发 (当 alt-tab 菜单可见时, alt 键是按住的). IfWinExist ahk_class #32771 ; 表示 alt-tab 菜单出现在屏幕上. Send !{Escape}{Alt up} return
当前, 所有特殊的 Alt-tab 动作必须像上面的例子那样直接指定到热键上 (即它们无法像命令那样使用). 它们 不受 #IfWin 或 #If 的影响.
自定义的 alt-tab 动作还可以通过热键创建. 在下面的例子中, 按下 F1 来显示菜单并预先向前移动. 然后可以按下 F2 来激活选择的窗口 (或按下 Escape 取消):
*F1::Send {Alt down}{tab} ; 这里需要星号.
!F2::Send {Alt up} ; 释放 Alt 键激活选择的窗口.
~*Escape::
IfWinExist ahk_class #32771
Send {Escape}{Alt up} ; 取消菜单而不激活选择的窗口.
return
函数热键[v1.1.20+]
一个或多个热键可以关联到函数,通过简单的定义函数在热键标签后面,例如:
; Ctrl+Shift+O to open containing folder in Explorer.
; Ctrl+Shift+E在资源管理器中定位当前编辑文件.
; 支持SciTE和Notepad++.
^+o::
^+e::
editor_open_folder() {
WinGetTitle, path, A
if RegExMatch(path, "\*?\K(.*)\\[^\\]+(?= [-*] )", path)
if (FileExist(path) && A_ThisHotkey = "^+e")
Run explorer.exe /select`,"%path%"
else
Run explorer.exe "%path1%"
}
在热键标签或者标签和函数之间仅允许空白,注释或者指令. 没有热键的标签被创建通过这种定义方式; 然而 自动执行段 结束再第一个热键就算关联了函数.
这种方式的主要好处是可以使用局部变量从而避免两个或两个以上的热键使用相同的变量名.它也鼓励自我记录热键就像上面的代码在函数内描述热键.
Hotkey也可以关联函数或函数对象.
入门和简单示例
尽管热字串主要用于在您输入缩写时进行扩展 (自动替换), 但是它们也可以用来运行任何脚本动作. 从这个角度看, 它们类似于 热键, 只是它们通常由多个字符组成 (即字符串).
要定义热字串, 请用两个双冒号包围用来触发的缩写, 例如:
::btw::by the way
在上面的例子中, 每当您输入缩写 btw 时会被自动替换为 "by the way" (不过, 默认情况下您必须在输入 btw 后输入 终止符, 例如空格, 句点或回车).
上面的 "by the way" 示例被称为自动替换热字串, 因为输入的文本被自动替换为第二个双冒号后指定的字符串. 与之相比, 热字串还可以定义用来执行任何自定义动作, 例如. 注意命令必须放在热字串的 下面.
::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,且在它们之间还有一个原义的空格).通过编辑下列示例可以改变这个字符集合,这个例子中为 所有的 热字串设置新的终止符,而不仅是在它下面的那些.
#Hotstring EndChars -()[]{}:;'"/\,.?!`n `t
选项
可以使用下面的两种方式改变热字串的默认行为:
- #Hotstring 指令, 它会影响脚本中实际在它后面的所有热字串. 下列示例会让 C 和 R 选项生效:
#Hotstring c r. - 把选项放在热字串的第一个双冒号之间. 下列示例会让 C 和 * 选项对当前热字串生效:
:c*:j@::john@somedomain.com ; 区分大小写且"不需要终止符"..
下面列表中对每个选项进行说明. 当使用上面的方法指定多个选项时, 可以在选项间包含空格.
* (星号): 不需要终止符 (即空格, 句点或回车) 来触发热字串.例如:
:*:j@::jsmith@somedomain.com
上面的示例会在您输入 @ 字符时立即进行替换. 如果在 #Hotstring 指令 中含有此选项, 那么可以使用 *0 来关闭它.
? (问号): 即使此热字串在另一个单词中也会被触发; 即, 在字符串被混排前立即输入字符. 例如,如果 :?:al::airline 为热字串,那么输入"practical "会得到"practicairline ".使用 ?0 来关闭此选项.
B0 (B 后跟着零): 不 进行自动退格来擦除您输入的缩写. 关闭此选项后可以使用 B 来启用. 脚本还可以通过 {bs 5} 实现自己的退格, 这里发送 5 次退格. 同样地, 可以通过 {left 5} 发送左方向键的键击. 例如,下面的热字串产生"<em></em>"并把光标向左移动 5 个位置(这样它就在标签之间了):
:*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: 这个非常少用的选项会在每次热字串触发后重置热字串识别器. 换句话说, 脚本将开始等待全新的热字串, 而不考虑您之前输入的任何内容. 这可以避免意外地触发字符串. 为了进行说明, 请思考下面的字符串:
:b0*?:11:: SendInput xx return
由于上面没有使用 Z 选项, 所以输入 111 (三个连续的 1) 会触发热字串两次, 因为中间的 1 既是首次触发的 末尾 字符, 又是第二次触发的 起始 字符. 在 b0 前面加上字母 Z 后, 您必须输入四个 1 而不是三个才能触发热键两次. 使用 Z0 来关闭此选项.
超长替换
使用 延续片段 的方法可以让产生大量替换文本的热字串变得更具可读性和可维护性. 例如:
::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 指令可以让选择的热字串产生上下文相关性. 这样的热字串会根据窗口是否活动或存在的不同情况发送不同的替换, 执行不同的动作或什么都不做. 例如:
#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 热键来方便地添加更多拼写错误:
下载: AutoCorrect.ahk (127 KB)
作者: Jim Biancolo 和 维基百科的常见拼写错误列表
备注
替换文本中当前不支持例如 %MyVar% 这样的变量引用.要解决此问题,请不要让这样的热字串自动替换.而是在缩写的下面使用 SendInput 命令,后跟着仅包含单词 Return 的行.
要在替换文本后发送额外的空格或 tab, 可以把它们加在替换文本后, 但需要在末尾加上重音符/反引号 (`). 例如:
:*:btw::By the way `
鼠标左键或右键的任何点击都会重置热字串识别器. 换句话说,脚本将开始等待全新的热字串,而不考虑您之前输入的任何内容(如果您不希望这样,请在脚本的任意位置指定 #Hotstring NoMouse 这行).在 "鼠标点击时重置" 的行为是默认的, 因为每次点击通常会移动插入点 (光标) 或设置键盘焦点到新的控件/区域. 在这种情况下, 通常希望: 1) 即使没有 问号选项 也触发热键; 2) 防止您在点击鼠标后输入的一些内容与之前输入的内容意外形成有效的缩写从而触发热字串.
内置变量 A_EndChar 包含了触发最近的非自动替换热字串时的终止符. 如果不需要终止符 (使用了 * 选项), 那么它会被置空. A_EndChar 可以用于使用 Send 命令的热字串或根据您输入的不同终止符改变行为的那些热字串.要发送终止符自身,请使用 SendRaw %A_EndChar%(使用 SendRaw 是因为普通的 Send 命令无法正确发送类似 !{} 这样的字符).
尽管在热字串定义中的逗号,百分号和单冒号不需要进行转义,但反引号和那些在空格或 tab 右边的分号则需要.请参阅 转义序列 了解完整的列表.
尽管在 自动替换文本 (在没有使用 原始选项 时) 中支持 Send 命令 的特殊字符例如 {Enter}, 但热字串自身却不使用这种方式. 而是使用 `n 表示 ENTER 键, `t (或原义的 tab) 表示 TAB (请参阅 转义序列 了解完整的列表). 例如,当您输入"ab"后跟着 tab 时会触发热字串 :*:ab`t::.
热字串会原义地处理在它的定义中的空格和 tab.例如后面的热字串会产生两种不同的效果:::btw::by the way 和 ::btw:: by the way.
每个热字串缩写的长度不能超过 40 个字符. 超出此长度后程序会向您提出警告. 与之相比, 当 发送模式 为默认的 SendInput 时热字串的替换文本的长度限制约为 5000 个字符. 通过切换到其他 发送模式 可以把此限制增加到 16,383 字符. 此外,在热字串的替换文本部分使用 SendPlay %MyVariable% 可以发送不限数量的文本.
热字串的定义顺序决定了它们的相对优先级. 换句话说, 如果多个热字串匹配您输入的内容, 那么只有脚本中首先列出的那个会生效. 相关主题:上下文相关热字串.
为了识别热字串, 您输入的所有退格都会被计算进来. 然而, 使用方向键, PageUp, PageDown, Home 以及 End 在编辑器中导航会重置热字串识别过程. 换句话说, 它会开始等待全新的热字串.
即使当前活动窗口忽略您的键击时也可以输入热字串. 换句话说, 即使触发的缩略词不可见时热字串仍会被触发. 此外, 您还可以使用退格键撤销最近输入的键击 (尽管您无法看到效果).
可以 Gosub 或 Goto 到热字串标签, 只需在热字串的标签名称前包含第一个双冒号 (以及所有选项符号). 例如:Gosub ::xyz.然而, 跳转到 单行 (自动替换) 热字串 会除了执行 return 外什么都不做.
尽管不会监视热字串且在不可见的 Input 命令执行时也不会触发它们, 但是可见的 Input 却能触发它们.
默认情况下, 由任何 AutoHotkey 脚本生成的键击永远不会触发热字串. 这避免了热字串彼此反复地触发而形成的无限循环的可能性. 在 v1.1.06 及更高版本中, 此行为可以使用 #InputLevel 和 SendLevel 进行控制. 然而, 自动替换型热字串的发送级别总为 0, 因此永远不会触发 钩子热键 或热字串.
在某些时候 Input 命令比热字串更灵活. 例如, 它可以对活动窗口 (例如游戏) 隐藏您的键击. 它还支持非字符型的终止键, 例如 Escape.
任何包含热字串的脚本会自动使用 键盘钩子.
在下面的情况中热字串与热键具有相同的特性:
- 它们都受 Suspend 命令影响.
- 它们都遵循 #MaxThreads 和 #MaxThreadsPerHotkey 的设置 (但不遵循 #MaxThreadsBuffer).
- 包含热字串的脚本会自动变成 持续运行的.
- 非自动替换热字串在运行时会创建新的 线程. 此外, 它们会更新内置热键变量, 例如 A_ThisHotkey.
已知限制: 在 Java 应用程序的某些系统中, 热字串可能会干扰用户输入 diacritical 字母 (通过 dead 键). 为了解决此问题, 可以临时打开 Suspend (这样禁用了所有热字串).
热字串助手
Andreas Borutta 推荐了下面的脚本, 如果您是深度的热字串用户, 那么它会很有用. 使用 Win+H (或您选择的其他热键), 可以把当前选择的文本转变成热字串. 例如, 如果您在字处理软件中选择了 "by the way", 按下 Win+H 会提示您输入其缩写 (例如 btw), 然后把新热字串添加到脚本中. 之后会重新载入脚本来激活热字串.
#h:: ; Win+H hotkey ; 获取当前选择的文本. 使用剪贴板代替 ; "ControlGet Selected", 是因为它可以工作于更大范围的编辑器 ; (即字处理软件). 保存剪贴板当前的内容 ; 以便在后面恢复. 尽管这里只能处理纯文本, ; 但总比没有好: AutoTrim Off ; 保留剪贴板中任何前导和尾随空白字符. ClipboardOld = %ClipboardAll% Clipboard = ; 必须清空, 才能检测是否有效. Send ^c ClipWait 1 if ErrorLevel ; ClipWait 超时. return ; 替换 CRLF 和/或 LF 为 `n 以便用于 "发送原始模式的" 热字串: ; 对其他任何在原始模式下可能出现问题 ; 的字符进行相同的处理: StringReplace, Hotstring, Clipboard, ``, ````, All ; 首先进行此替换以避免和后面的操作冲突. StringReplace, Hotstring, Hotstring, `r`n, ``r, All ; 在 MS Word 等软件中中使用 `r 会比 `n 工作的更好. StringReplace, Hotstring, Hotstring, `n, ``r, All StringReplace, Hotstring, Hotstring, %A_Tab%, ``t, All StringReplace, Hotstring, Hotstring, `;, ```;, All Clipboard = %ClipboardOld% ; 恢复剪贴板之前的内容. ; 这里会移动 InputBox 的光标到更人性化的位置: SetTimer, MoveCaret, 10 ; 显示 InputBox, 提供默认的热字串: InputBox, Hotstring, New Hotstring, Type your abreviation at the indicated insertion point. You can also edit the replacement text if you wish.`n`nExample entry: :R:btw`::by the way,,,,,,,, :R:`::%Hotstring% if ErrorLevel ; 用户选择了取消. return IfInString, Hotstring, :R`::: { MsgBox You didn't provide an abbreviation. The hotstring has not been added. return } ; 否则添加热字串并重新加载脚本: FileAppend, `n%Hotstring%, %A_ScriptFullPath% ; 在开始处放置 `n 以防文件末尾没有空行. Reload Sleep 200 ; 如果加载成功, reload 会在 Sleep 期间关闭当前实例, 所以永远不会执行到下面的语句. MsgBox, 4,, The hotstring just added appears to be improperly formatted. Would you like to open the script for editing? Note that the bad hotstring is at the bottom of the script. IfMsgBox, Yes, Edit return MoveCaret: IfWinNotActive, New Hotstring return ; 否则移动 InputBox 中的光标到用户输入缩写的位置. Send {Home}{Right 3} SetTimer, MoveCaret, Off return
本文档详细介绍了AutoHotkey中热键的使用,包括如何定义上下文相关的热键、自定义组合键、鼠标滚轮热键、热键技巧以及热字串的创建和使用,提供了一系列实例来帮助理解。

2万+

被折叠的 条评论
为什么被折叠?



