热键


在一个脚本运行的时候,创建、修改、启用或禁用一个热键。

Hotkey, KeyName [, Label, Options]
Hotkey, IfWinActive/Exist [, WinTitle, WinText]

参数

KeyName

热键的触发键的名称,包括任何 修饰键符号(modifier symbols)。 例如, 用 #c 来代替 Win+C 的热键。

如果 KeyName 是一个现有的热键,那么该热键将被此命令的其它参数值修改。

KeyName 也可以是一个现有的热键标记名字(也就是一个双冒号标记),这将导致原来的热键被此命令的其他参数值修改。

操作一个 现有 的热键时, KeyName 是大小写敏感的。不过,按键名称必须与现存热键的相同(比如,这种情况下 Esc 和 Escape 就是不同的),另外,修饰键符号 的顺序是无关紧要的。

当前的 IfWin 设置 决定了 Hotkey 命令要处理一个热键的哪个 变体 ,如果该变体尚不存在,将会被创建出来。

一个热键第一次被创建出来的时候——不论是通过 Hotkey 命令还是脚本中的 双冒号标记 ——它的键名和修饰键顺序就成为该热键的永久名称。就算此后 Hotkey 命令处理一个不同修饰键顺序的该热键,热键名称也不会发生改变。

Label

热键按下的时候,将要被执行(作为一个新的 线程 )的那个标记名字。普通标记和 热键/热字串 标记都可以。不要包含后面的冒号。如果使用可变的 Label (比如 %VarContainingLabelName% 这样包含标签名的变量),请事先调用 IsLabel(VarContainingLabelName)以确保该标签的存在性。

如果 KeyName 对应一个现存的热键,本参数可以留空,这种情况下标记不会发生变化。这在仅仅修改热键的 Options 的情况下很有用。

如果该标记此前已经用此命令禁用了,它将继续禁用下去。要启用它,在 Options 中包含 ON 即可。

本参数可以是下列特定值中的一个:

On:热键将被启用。如果该热键已经处于可用状态,就不会有效果。

Off:热键将被禁用。如果该热键已经处于禁用状态,就不会有效果。

Toggle:该热键的状态将被切换(启用或禁用)。

AltTab (或其它):这些是在 这里 提到的 Alt-Tab 特殊热键。

备注:当前的 IfWin 设置 决定了将要被 On/Off/Toggle 的热键是哪个 变体

Options

由任意数量的下列内容构成的字符串,可以用空格将其分割(或不分割)。例如:UseErrorLevel B0 。

UseErrorLevel:如果此命令遇到一个问题,,这个选项将会忽略警告对话框,将 ErrorLevel 设置为 下表 中的一个代码,然后让 当前线程 继续执行。

On:如果该热键当前被禁用,此选项将启动它。

Off:如果该热键当前处于可用状态,此选项将禁用它。这个选项通常用来以禁用状态创建一个热键。

B 或者 B0:指定 B 将会把该热键以 #MaxThreadsBuffer 中描述的方式设置缓冲。指定 B0(B后面跟一个零)禁用这种缓冲。

Pn:指定 P 跟随该热键的 线程优先级。如果创建热键的时候 P 选项被省略,优先级将被设置为 0 。

Tn:指定 T 后跟随 #MaxThreadsPerHotkey 中描述的线程数,例如:T5

如果 同时/部分 省略了 B 和 T 两个选项并且该热键已经存在,这些设置值将不会改变。但如果该热键还没有被创建——就是说要用当前命令创建它的时候——它们将被指定为最近使用过的值。例如,最靠近脚本结尾的 #MaxThreadsBuffer 的值将会被采用。如果当前脚本中没有出现过 #MaxThreadsBuffer ,它的缺省值(OFF)将会被采用。对于 #IfWin 的表现也是这样:除非脚本启动之后 "Hotkey IfWin" 被执行过,否则最靠近脚本结尾的那个结果将在创建热键的时候被采用。

备注:当前的 IfWin 设置 决定了将要被处理的热键是哪个 变体。如果该变体尚未被创建,将在这时被创建。

IfWinActive
IfWinExist
(IfWinNotActive 和 IfWinNotExist 都可以使用)这些子命令将会使此后创建的热键都是上下文相关的。详细信息见 下面
WinTitle
WinText

在这两个参数中,用 %var% 这种方式引用的变量将在命令执行结束时被固定下来。换句话说,此后的命令对该变量内容的修改不会影响现存的 IfWin 热键。

类似于 #IfWinActive/ExistWinTitleWinText 使用自动执行部分中对 SetTitleMatchModeDetectHiddenWindows 的缺省设置。详细内容请参阅 #IfWinActive/Exist

ErrorLevel

只有在下列情况时,ErrorLevel 才会被改变:1)如果第一个参数是 IfWin[Not]Active/Exist,这种情况下遇到问题的话置 1 ,否则置 0; 2) UseErrorLevel出现在 Options 参数中。

Error 描述
1 Label 中制定了一个不存在的标记的名字。
2 KeyName 中指定了当前的 键盘布局/语言 既不能识别也不能支持的按键。(译注:这应该就是 热键名/热字串名 中不能使用中文的原因。)
3 不被支持的前缀键。例如,使用鼠标滚轮作为热键的前缀,WheelDown & Enter 这样的热键就不会被支持。
4 KeyName 不适合用在 AltTab or ShiftAltTab 功能上。这种情况需要两个键组合。例如: RControl & RShift::AltTab
5 该命令试图对不存在的热键进行修改。
6 该命令试图对一个热键的不存在的 变体 进行修改。要避免这个问题,用 "IsLabel(VarContainingLabelName)" 确保操作目标的存在。
50 Windows 95/98/Me:命令成功执行,但操作系统拒绝激活该热键。导致这个问题的通常是该热键正在被其它脚本或者应用程序(或者是操作系统自身)使用。这个问题仅仅出现在 Windows 95/98/Me 中,因为其它操作系统中,(AutoHotkey)程序会借助 键盘钩子取代 这个优先权。
51 Windows 95/98/Me:命令成功执行,但是 Windows 95/98/Me 不支持该热键。例如,鼠标热键和 "a & b" 这种热键都不会被支持。
98 如果创建了这个热键将会突破 每脚本1000个热键 的限制(不过,每个热键的 变体 数量不限,热字串 的数量也没有限制)。
99 内存耗尽。这种情况极少发生,通常仅仅在操作系统变得不稳定的时候才发生。


提示:UseErrorLevel 选项可以用来检验一个热键变体的存在性。例如:

Hotkey, ^!p,, UseErrorLevel
if ErrorLevel in 5,6
    MsgBox 该热键不存在,或者不存在当前 IfWin 条件下的变体。

注意

如果仅仅为了根据当前处于激活状态的窗口来自动禁用某个热键,Hotkey, ^!c, Off 这种方式就不如 #IfWinActive/Exist(或者下面提到的改良等价版本 "Hotkey IfWinActive/Exist" )来得方便了。

通过双冒号标记创建的热键的执行效率高于通过 Hotkey 命令创建的热键,因为它们在脚本启动的时候会被批量地全部启用(而非一个个地启动)。所以,最好用本命令来创建那些在脚本运行后才能知道名称的热键。这样的情形之一是:脚本文件通过 INI文件 为热键配置多个不同的行为。

一个特定的标记可以被多个热键指向。如果知道某个标记是被其它热键呼叫的,可以查询内建变量 A_ThisHotkey 来判断它哪个热键。

如果脚本被 挂起 了,新 添加/启用 的热键也会被挂起,直到挂起状态被关闭(除非它们像 Suspend 章节描述的那样被排除了)。

通过本命令做出的改变可能导致 键盘 和/或 鼠标 钩子被安装或者移除。

虽然 Hotkey 命令不能直接启用或禁用其它脚本中的热键,多数情况下却可以通过启用或创建同名热键来 覆盖 它。覆盖成功与否取决于以下因素:1)将要覆盖的另一个脚本中的热键是否是一个 钩子热键(非钩子热键,只要不是在 Win9x 上总是会被覆盖);2)最近启动的脚本中的热键通常要优先于其它脚本中的热键(因此,如果要覆盖的脚本是最近启动的,覆盖总是会成功);3)该热键被启用或者创建是否会重新激活 键盘 或者 鼠标 钩子(如果是,覆盖将总是成功)。

一旦某个脚本包含至少一个热键,它将持续运行,这意味着要使用 ExitApp 而不是 Exit 来终结它。除非指定了 #SingleInstance Off,热键脚本也会自动具有 #SingleInstance 属性。

关于 Hotkey, IfWinXX [, WinTitle, WinText] 要注意

"Hotkey IfWin" 命令将在脚本运行的时候允许上下文相关热键被创建和修改(与之不同的是,#IfWinActive/Exist 指令是位置固定的并且在脚本启动同时起作用)。例如:

Hotkey, IfWinActive, ahk_class Notepad
Hotkey, ^!e, MyLabel  ; 创建一个仅仅在记事本中工作的热键

使用 "Hotkey IfWin" 将把随后创建和修改的热键都变成上下文相关的。另外,每个 IfWin 子命令是互斥执行的;就是说,只有最近的一个才能产生作用。

要关闭上下文相关性(就是让随后创建的热键都能在所有窗口下运行),指定一个忽略了 WinTitle/Text 这些参数的 IfWin 子命令即可。例如: Hotkey ,IfWinActive

如果一个脚本从来没用过 "Hotkey IfWin",最近用过的 #IfWin 指令(用过的话)将作用于 Hotkey 命令。

如果通过 IfWin 禁用一个鼠标或者键盘热键,该热键将执行它原本的功能;就是说,就算没有这样的热键,它也将发送给激活窗口。有两种情况例外:1) Windows 95/98/Me 中 IfWin禁用的 热键不起作用(就连原本的功能也失效);2)操纵杆热键,尽管 IfWin 有效,但它根本不会阻止其它程序检测它的按键。

变体 (副本) 热键 Variant (Duplicate) Hotkeys

只要具有不同的 IfWin 约束,特定的热键可以被多次创建。这被称作 热键变体。例如:

Hotkey, IfWinActive, ahk_class Notepad
Hotkey, ^!c, MyLabelForNotepad
Hotkey, IfWinActive, ahk_class WordPadClass
Hotkey, ^!c, MyLabelForWordPad
Hotkey, IfWinActive
Hotkey, ^!c, MyLabelForAllOtherWindows

如果不止一个变体符合热键的触发条件,全局变体属于例外(不受 IfWin 约束的那个):它的优先级最低,就是说,其它变体都不会被触发的时候,它才触发。

创建副本热键时,像 ^!+# 这些修饰键符号的顺序无关紧要。例如:^!c 和 !^c 是相同的。不过,按键的拼写方式必须始终如一。例如: EscEscape 在这种情况下就是不同的(尽管大小写没有关系)。使用了 通配符前缀(*) 的热键跟没使用的完全不同;例如:*F1 和 F1 将会各自定义一套变体。

关于 IfWin 热键的详细内容,请参阅 #IfWin's General Remarks

相关命令

Hotkey Symbols, #IfWinActive/Exist, #MaxThreadsBuffer, #MaxThreadsPerHotkey, Suspend, IsLabel(), Threads, Thread, Critical, Gosub, Return, Menu, SetTimer

示例

Hotkey, ^!z, MyLabel
return

MyLabel:
MsgBox 按下了 %A_ThisHotkey%.
return

; 其它示例:
Hotkey, RCtrl & RShift, AltTab ; 用 RCtrl & RShift 替换 Alt-Tab 的操作。
Hotkey, #c, On  ; 重新启用热键 Win-C。
Hotkey, $+#c, Off  ; 禁用热键 Shift-Win-C 。
Hotkey, ^!a, , T5  ; 使该热键可以拥有 5 个线程。

Hotkey, IfWinActive, ahk_class Notepad
Hotkey, ^!c, MyLabelForNotepad  ; 创建一个仅仅能用在记事本中的热键 Ctrl-Alt-C 。