# KeyWait

等待一个按键或鼠标/操纵杆按钮被松开或者按下。

KeyWait, KeyName [, Options]

#### 参数

KeyName | 这个名称可以是键盘上的几乎任意单独字符或者是 按键列表 里的某个按键名称，例如一个鼠标/操纵杆按钮。不支持除了操纵杆的按钮外的操纵杆属性。 也可以指定一个显式的虚拟按键代码例如 vkFF 。当一个按键没有名称并且在按下时生成不可见的字符这种罕见的情况时，这会很有用。它的虚拟按键代码可以通过参照 按键列表页面 底部的步骤来确定。
Options | 如果此参数为空，命令将无限期地等待用户自己松开指定的按键或鼠标/操纵杆按钮。不过，如果没有安装 键盘钩子 并且 KeyName 是通过例如 Send 命令人为地松开的一个键盘按键，按键将被视为物理地松开了。当没有安装 鼠标钩子 时，对鼠标按键来说也是一样的。 Options: 一个下列单个或多个字母组成的字符串(可任意顺序，在中间的空格是可选的): D: 等待按键被按下。 L: 检测按键的逻辑状态，这是操作系统和激活的窗口相信按键会一直处于的状态(不一定和物理的状态一样)。译注：按键被检测时所处的状态会成为它永远的状态而不管之后是否物理地改变。此选项忽略操纵杆按钮。 T: 超时(例如，T3)。在判定超时并设置 ErrorLevel 为 1 之前要等待的秒数。如果按键或按钮达到了指定的状态，命令不会等到超时期满。反而，它将马上设置 ErrorLevel 为 0 并且脚本将继续执行。 超时的参数值可以是一个浮点数例如 2.5 ，但不能是一个十六进制的数值例如 0x03 。

#### ErrorLevel

如果命令超时 ErrorLevel 将设为 1 ，反之为 0 。

#### 注意

在 Windows Me/98/95 下，一个按键或鼠标按键的物理状态将一直和它的逻辑状态一致。

在 Windows NT/2k/XP 以及之后版本，一个按键或鼠标按键的物理状态通常将和逻辑状态一致，除非安装了键盘和/或鼠标钩子，这种情况下它会精确地反映逻辑状态而无论用户是否物理地按住了按键。通过 KeyHistory 的命令或菜单项你能确定你的脚本是否在使用钩子。你能通过给脚本添加 #InstallKeybdHook 和 #InstallMouseHook 指令来强制安装任何一个或两个钩子。

当命令处于一个等待状态时，新的 threads(线程) 能通过 hotkey, 自定义菜单项 或 timer 来启动。

要等待两个或多个按键被松开，请连续地使用 KeyWait 。例如：

    KeyWait Control  ; 等待 Control 和 Alt 两个都被松开。
    KeyWait Alt

要等待一系列按键中的某个按键被按下，请看 Input 命令的示例部分。

#### 相关命令

GetKeyState, Key List, Input, KeyHistory, #InstallKeybdHook, #InstallMouseHook, ClipWait, WinWait

#### 示例

    ; 例子 #1: 基本用法：
    KeyWait, a  ; 等待按键 A 被松开。
    KeyWait, LButton, D  ; 等待鼠标左键被按下。
    KeyWait, Joy1, D T3  ; 等待首个操纵杆按钮在 3 秒内按下。
    KeyWait, LAlt, L  ; 等待左边的 Alt 键被逻辑地松开。

    ; 例子 #2: 一个简单的热键：
    ~Capslock::
    KeyWait, Capslock  ; 等待用户物理地松开它。
    MsgBox 你按了并且松开了 Capslock 键。
    return

    ; 例子 #3: 重映射一个按键或鼠标按钮 (这仅是为了阐述，因为使用 内置重映射特性 会更加简单):
    ; 当 NumpadAdd 按下时鼠标左键是按住的，这实际上把 NumpadAdd 变成了鼠标左键。

    *NumpadAdd::
    MouseClick, left,,, 1, 0, D  ; 按住鼠标左键。
    KeyWait, NumpadAdd  ; 等待按键被松开。
    MouseClick, left,,, 1, 0, U  ; 松开鼠标按键。
    return

    ; 例子 #4: 检测何时一个按键被两次按下 (近似于双击)。
    ; 当你按住 RControl 键要修饰另一个按键时，KeyWait 被用来阻止键盘的自动重复特性创造出一个不需要的两次按键。
    ; 它通过依赖于 #MaxThreadsPerHotkey 处于它的默认设置 1 来保持住热键的线程运行从而阻止自动重复。
    ; 注意：在 SetTimer 页面的底部有一个更复杂的脚本来辨别单次、两次和三次按键之间的区别。
    ~RControl::
    if (A_PriorHotkey <> "~RControl" or A_TimeSincePriorHotkey > 400)
    {
        ; 在按键之间间隔太久，所以这不是一个两次按键。
        KeyWait, RControl
        return
    }
    MsgBox 你两次按击了右边的 control 键。
    return

翻译：天堂之门 menk33@163.com 2008年8月18日