GetKeyState

GetKeyState 可以用作函数命令, 但建议在新脚本中使用前者. 两者都检查键盘按键或鼠标/控制器按钮是否按下或松开, 并且能检索控制器状态. 不同之处在于, 函数可以在表达式中使用, 并返回 1(true) 表示向下或 0(false) 表示向上, 而命令将 D(表示向下) 或 U(表示向上) 存储在变量中.

GetKeyState 函数

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

KeyIsDown := GetKeyState(KeyName , Mode)

参数

KeyName(按键名称)

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

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

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

Mode

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

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

或者, 可以指定以下字母之一:

P: 获取物理状态( 即用户是否实际按住了按键). 如果没有安装键盘和/或鼠标钩子, 则按键或鼠标按键的物理状态通常和逻辑状态一致(有时逻辑状态可能比物理状态滞后), 如果安装了钩子, 则它会准确反映出用户是否按下了按键或鼠标按键(只要在脚本执行时按键正被按住). 您可以通过 KeyHistory 命令或菜单项来确定脚本中是否使用了钩子. 您可以通过添加 #InstallKeybdHook 和/或 #InstallMouseHook 指令到脚本中来强制安装钩子.

T: 获取切换状态(仅对可以切换的按键才有效, 例如 CapsLock, NumLock, ScrollLockInsert). 获取的值为 1(true) 表明按键是 "on"(打开的), 而 0(false) 表明它是 "off"(关闭的).

返回值

如果键是按下的(或打开了), 函数返回 1(true), 如果是松开的, 则返回 0(false). 对于控制器的特殊控制, 如轴和 POV 开关, 返回其他值.

如果 KeyName 无效或者无法确定键的状态, 则返回空字符串.

GetKeyState 命令

根据指定的键盘按键或鼠标/控制器按钮是上还是下, 将字母 D 或 U 存储在变量中. 也检索控制器状态.

过时的: 不推荐在新脚本中使用此命令. 请使用上面的 GetKeyState() 函数来代替.

GetKeyState, OutputVar, KeyName , Mode

参数

OutputVar

用于存储检索到的键状态的输出变量的名称, 它是 D 表示按下或 U 表示松开. 如果无法确定键的状态, 则该变量为空. 对于控制器的特殊控制, 如轴和 POV 开关, 将返回其他值.

KeyName

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

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

已知限制: 此命令无法区别共享相同虚拟按键代码的两个按键, 例如 Left 和 NumpadLeft.

Mode

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

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

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

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

T: 获取切换状态(仅对可以切换的按键才有效, 例如 CapsLock, NumLock, ScrollLockInsert). 获取的值为 D 表明按键是打开的, 而 U 表明它是关闭的.

控制器的特殊控制

KeyName 是手柄的轴, 如 JoyX 时, 返回值将是一个 0 到 100 之间的浮点数, 用于指示手柄的位置为该轴运动范围的百分比. 可以通过 Format()SetFormat 更改数字的格式. 这个测试脚本可以用来分析你的控制器.

KeyName 为 JoyPOV 时, 获取的值将介于 0 和 35900 之间. 许多控制器使用与下列近似的 POV 值:

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

备注

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

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

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

KeyWait, 按键列表, 控制器重映射, KeyHistory, #InstallKeybdHook, #InstallMouseHook

示例

函数 vs. 命令. 虽然第一个代码块使用函数, 第二个代码块使用命令, 但这两个代码块在功能上是相同的.

state := GetKeyState("RButton")  ; 鼠标右键.
state := GetKeyState("Joy2")  ; 第一个控制器的第二个按钮.

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

state := GetKeyState("CapsLock", "T") ;  如果 CapsLock 为 ON , 则为 True, 否则为 false.
GetKeyState, state, RButton  ; 鼠标右键.
GetKeyState, state, Joy2  ; 控制器的第二个按钮.

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

GetKeyState, state, CapsLock, T ;  当 CapsLock 打开时为 D, 否则为 U.

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

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

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

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).
return

其他示例

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