GetKeyState

根据指定的键盘按键或鼠标/控制器按钮是上还是下, 返回 1 (true) 或 0(false). 也检索控制器状态.

IsDown := GetKeyState(KeyName , Mode)

参数

KeyName

类型: 字符串

此参数可以是键盘中任何的单个字符或按键列表中的其中一个键名, 如一个鼠标/控制器按键. 例如: B, 5, LWin, RControl, Alt, Enter, Escape, LButton, MButton, Joy1.

或者, 可以指定明确的虚拟键代码, 例如 vkFF. 这在按键没有名字的罕见情况下很有用. 这种按键的代码可以通过按键列表页底部的步骤来确定. 请注意, 这个代码必须是十六进制的.

已知限制: 此函数不能区分两个共享相同虚拟键代码的键, 例如 Left 和 NumpadLeft.

Mode

类型: 字符串

获取控制器状态时, 此参数被忽略.

如果未设置或省略, 则模式默认是获取按键的逻辑状态. 这是操作系统和活动窗口所认为的按键所处的状态, 但可能和按键的物理状态不一致.

否则, 请指定以下字母之一:

P: 获取物理状态( 即用户是否实际按住了按键). 按键或鼠标按键的物理状态通常和逻辑状态一致, 除非安装了键盘和/或鼠标钩子, 在这种情况下, 它将准确反映出用户是否按下了按键或鼠标按键(只要在脚本执行时按键正被按住). 您可以通过 KeyHistory 函数或菜单项来确定脚本中是否使用了钩子. 您可以通过调用 #InstallKeybdHook 和/或 #InstallMouseHook 函数来强制安装钩子.

T: 获取切换状态. 对于除 CapsLock, NumLockScrollLock 以外的键, 当脚本启动时, 切换状态一般为 0, 并且在进程之间不同步.

返回值

类型: 整数(布尔值), 浮点数, 整数字符串(空值)

对于键盘键和鼠标按钮, 如果键位向下(或切换开启), 该函数返回 1(true) 如果键位向上(或切换关闭), 该函数返回 0(false).

KeyName 是控制器的轴, 如 JoyX, 函数返回一个 0 到 100 之间的浮点数, 用于指示控制器的位置为该轴运动范围的百分比. 这个测试脚本可以用来分析你的控制器.

KeyName 是 JoyPOV 时, 函数返回一个 0 到 35900 之间的整数. 许多控制器使用与下列近似的 POV 值:

KeyName 为 JoyName, JoyButtons, JoyAxes 或 JoyInfo, 检索值将是控制器的名称, 按钮数量, 轴数量或功能. 有关详情, 请参阅游戏控制器.

KeyName 是无法检测到的控制器的按钮或控制键时, 函数返回空字符串.

错误处理

如果检测到无效参数, 则抛出 ValueError, 例如当前键盘布局中不存在 KeyName.

备注

为了等待按键或鼠标/控制器按钮进入新的状态, 通常使用 KeyWait 代替 GetKeyState 的循环会更简单.

带有不常见键盘驱动的系统更新按键的状态可能比较慢, 尤其是像 CapsLock. 这样按键的切换状态. 在按键状态改变后立即对其状态进行检查的脚本可以预先使用 Sleep, 以便系统有时间更新按键的状态.

有关对控制器使用, 请参阅控制器重映射页面控制器到鼠标的映射脚本.

GetKeyVK, GetKeySC, GetKeyName, KeyWait, Key List, Controller remapping, KeyHistory, InstallKeybdHook, InstallMouseHook

示例

检索鼠标右键的当前状态.

state := GetKeyState("RButton")

检索首个控制器的第二个按钮的当前状态.

state := GetKeyState("Joy2")

检查是否至少有一个 Shift 被关闭.

if GetKeyState("Shift")
    MsgBox "At least one Shift key is down."
else
    MsgBox "Neither Shift key is down."

读取 CapsLock 的当前切换状态.

state := GetKeyState("CapsLock", "T")

重映射. (此示例仅用于说明, 因为内置的重新映射功能更容易使用.) 在下面的热键中, 按下 NumpadAdd 时, 鼠标按钮被按住, 这有效地将 NumpadAdd 变成了一个鼠标按键. 该方法还可以用于重复操作, 而用户正在按住一个键或按键.

*NumpadAdd::
{
    MouseClick "left",,, 1, 0, "D"  ; 按住鼠标左键.
    Loop
    {
        Sleep 10
        if !GetKeyState("NumpadAdd", "P")  ; 按键已经被释放, 所以退出循环.
            break
        ; ... 此处放置您想要重复的任何动作.
    }
    MouseClick "left",,, 1, 0, "U"  ; 释放鼠标按钮.
}

使控制器按钮的行为取决于操纵杆轴的位置.

joy2::
{
    JoyX := GetKeyState("JoyX")
    if JoyX > 75
        MsgBox "Action #1 (button pressed while stick was pushed to the right)."
    else if JoyX < 25
        MsgBox "Action #2 (button pressed while stick was pushed to the left)."
    else
        MsgBox "Action #3 (button pressed while stick was centered horizontally)."
}

请参阅控制器重映射页面控制器到鼠标的映射脚本的其他示例.

unixetc