KeyWait

等待按键或鼠标/控制器按钮被松开或按下.

KeyWait KeyName , Options

参数

KeyName

类型: 字符串

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

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

Options

类型: 字符串

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

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

D: 等待按键被按下.

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

T: 超时(例如 T3). 超时前等待的秒数, 超时后返回 0. 如果按键或按钮达到指定的状态, 则函数不再等待超时时间到期. 相反地, 它会立即返回 1.

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

返回值

类型: 整数(布尔值)

如果该函数超时, 则此函数返回 0(false), 否则返回 1(true).

备注

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

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

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

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

要等待一组按键中的任意一个被按下, 请参阅 InputHook 示例 #4.

GetKeyState, Key List, InputHook, 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 "按下和释放了 CapsLock 键."
}

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

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

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

~RControl::
{
    if (A_PriorHotkey != "~RControl" or A_TimeSincePriorHotkey > 400)
    {
        ; 两次按下时间间隔太长, 所以这不是按下两次.
        KeyWait "RControl"
        return
    }
    MsgBox "两次按下右 control 键."
}