# 热键

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

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/Exist，WinTitle 和 WinText 使用自动执行部分中对 SetTitleMatchMode 和 DetectHiddenWindows 的缺省设置。详细内容请参阅 #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 是相同的。不过，按键的拼写方式必须始终如一。例如： Esc 和 Escape 在这种情况下就是不同的(尽管大小写没有关系)。使用了 通配符前缀(*) 的热键跟没使用的完全不同；例如：*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 。