# KeyWait

等待按键或鼠标/操纵杆按钮被松开或按下.

    KeyWait, KeyName , Options

## 参数

KeyName

  此参数可以是键盘中任何的单个字符或按键列表中的其中一个键名, 例如鼠标/操纵杆按钮. 不支持除操纵杆按钮外的其他操纵杆属性.

  还可以指定明确的虚拟按键代码, 例如 `vkFF`. 只有在一个按键没有指定名称且按下时不产生可见的字符这样少见的情况下, 这种方法才有用. 它的虚拟按键代码可以通过按键列表页面底部的步骤来确定.

Options

  如果此参数为空, 则命令会无限期等待用户松开指定的按键或鼠标/操纵杆按钮. 不过, 如果没有安装键盘钩子并且 KeyName 是使用类似 Send 命令模拟释放的键盘按键, 则此按键会被视为物理松开了. 没有安装鼠标钩子时, 对鼠标按钮同样如此.

  选项: 由一个或多个下列字母组成的字符串(可任意顺序, 字母间可以用空格分隔):

  D: 等待按键被按下.

  L: 检测按键的逻辑状态, 这是操作系统和活动窗口所认为的按键所处的状态(可能和它的物理状态不一致). 对于操纵杆按钮会忽略此选项.

  T: 超时(例如 `T3`). 超时前等待的秒数, 超时后设置 ErrorLevel 为 1. 如果按键或按钮达到指定的状态, 则命令不再等待超时时间到期. 相反地, 它会立即设置 ErrorLevel 为 0 并让脚本继续执行.

  此超时时间值可以为浮点数(例如 2.5), 但不能为十六进制值(例如 0x03).

## ErrorLevel

命令超时后 ErrorLevel 被置为 1, 否则为 0.

## 备注

如果没有安装键盘和/或鼠标钩子, 则按键或鼠标按钮的物理状态通常和逻辑状态一致(有时逻辑状态可能比物理状态滞后); 如果安装了钩子, 则它会准确反映出用户是否按下了按键. 您可以通过 KeyHistory 命令或菜单项确定脚本中是否使用了钩子. 通过添加 #InstallKeybdHook 和 #InstallMouseHook 指令到脚本中您可以强制安装其中一种或两种钩子.

当此命令处于等待状态时, 可以通过热键, 自定义菜单项或计时器启动新的线程.

要等待两个或多个按键被释放, 请连续使用 KeyWait. 例如:

    KeyWait Control  ; 等待 Control 和 Alt 被释放.
    KeyWait Alt

要等待一组按键中的任意一个被按下, 请参阅 Input 命令的示例部分.

## 相关

GetKeyState(), 按键列表, Input, KeyHistory, #InstallKeybdHook, #InstallMouseHook, ClipWait, WinWait

## 示例

等待 A 键被释放.

    KeyWait, a

等待鼠标左键被按下.

    KeyWait, LButton, D

等待首个操纵杆按钮在 3 秒内被按下.

    KeyWait, Joy1, D T3

等待左 Alt 键被逻辑释放.

    KeyWait, LAlt, L

当按下这个热键时, KeyWait 会等待用户物理释放 CapsLock 键. 因此, 后续的语句是在释放而不是按下时执行的. 这个行为类似于 `~CapsLock up::`.

    ~CapsLock::
    KeyWait, CapsLock  ; 等待用户实际释放.
    MsgBox You pressed and released the CapsLock key.
    return

重映射按键或鼠标按钮(这里仅为了演示, 因为使用内置的重映射功能会更容易). 当 NumpadAdd 按下时持续按住鼠标左键, 这样实际上把 NumpadAdd 映射成了鼠标左键.

    *NumpadAdd::
    MouseClick, left,,, 1, 0, D  ; 按住鼠标左键.
    KeyWait, NumpadAdd  ; 等待按键被释放.
    MouseClick, left,,, 1, 0, U  ; 释放鼠标按钮.
    return

检测什么时候按下了某个按键两次(类似于双击). 当您按下 RControl 修饰另一个键时, 使用 KeyWait 来停止键盘自动重复功能以避免产生不想要的两次按下. 它通过保持热键线程的运行来实现这一点, 这依赖于 #MaxThreadsPerHotkey 默认设置值为 1, 从而阻止自动重复. 注意: 在 SetTimer 页面的底部有一个更精巧的脚本, 能分辨出单次, 两次和三次按下的区别.

    ~RControl::
    if (A_PriorHotkey != "~RControl" or A_TimeSincePriorHotkey > 400)
    {
        ; 两次按下时间间隔太长, 所以这不是一个两次按下.
        KeyWait, RControl
        return
    }
    MsgBox You double-pressed the right control key.
    return

dftg