BlockInput

AutoHotkey

BlockInput

禁用或启用用户通过键盘和鼠标与计算机交互的能力。

BlockInput, Mode

参数

Mode

模式 1: 下列单词的其中一个:

On: 阻止用户与计算机交互 (鼠标和键盘输入都无效).

Off: 重新启用输入.

模式 2:此模式的操作独立于其他两种。例如,BlockInput On 会继续阻塞输入直到使用了 BlockInput Off,即使在下面某个单词仍然有效的情况下。

Send: 正在执行 SendSendRaw 命令 (仅对于传统的 SendEvent 模式) 时, 用户的键盘和鼠标输入被忽略. 这样避免了用户的键击扰乱模拟键击流. 当 Send 结束时,会重新启用输入(在之前没有使用 BlockInput On 阻塞的情况下)。

Mouse: 正在执行 Click, MouseMove, MouseClickMouseClickDrag 命令 (仅对于传统的 SendEvent 模式) 时, 用户的键盘和鼠标输入被忽略. 这样避免了用户的鼠标移动和点击扰乱模拟鼠标事件. 当鼠标命令结束时,会重新启用输入(在之前没有使用 BlockInput On 阻塞的情况下)。

SendAndMouse: 上面两种模式的组合.

Default: 同时关闭 SendMouse 模式, 但不改变输入阻塞的当前状态. 例如,如果 BlockInput On 当前有效,那么使用 BlockInput Default 不会关闭它。

模式 3(需要 v1.0.43.11+):此模式的操作独立于其他两种。例如,如果 BlockInput OnBlockInput MouseMove 都有效,那么鼠标移动会被阻塞直到这两者被同时关闭。

MouseMove: 鼠标光标不会随用户对鼠标的物理移动而移动 (DirectInput 应用程序可能是个例外). 脚本中首次使用此命令时, 会安装 鼠标钩子 (在还没有安装时). 同时, 脚本变成 持续运行的, 这意味着应该使用 ExitApp 结束脚本. 鼠标钩子会一直保持加载状态,直到下一次使用 SuspendHotkey 命令,此时如果没有任何热键或热字串需要那么它会被移除(请参阅 #Hotstring NoMouse)。

MouseMoveOff: 允许用户移动鼠标光标.

备注

比起 BlockInput,通常优先考虑使用 SendMode InputSendMode Play 会更好,这样键击和鼠标点击会变得不可中断。这是因为与 BlockInput 不同, 这些模式不会丢弃发送期间用户输入的内容; 作为替代, 这些键击被缓冲起来在之后发送. 不使用 BlockInput 也避免了下一段落所描述的需要解决的粘滞按键问题.

如果在用户按住按键时启用 BlockInput, 可能会导致这些键 "卡住". 通过等待这些按键释放后才启用 BlockInput 可以避免此问题, 与本例一样:

^!p::
KeyWait Control  ; 等待按键释放.  为每个热键修饰符使用一次 KeyWait 命令.
KeyWait Alt
BlockInput On
; ... 发送键击和鼠标点击 ...
BlockInput Off
return

每当发送 ALT 事件时, 输入阻塞会自动和临时禁用 (之后重新启用).

BlockInput 生效时,用户的输入被拦截,不过 AutoHotkey 可以模拟键击和鼠标点击。然而由于 Windows API 的特性,按下 Ctrl+Alt+Del 将重新启用输入。

钩子热键 的某些类型在 BlockInput 启用时仍然可以被触发. 例子包括 MButton(鼠标钩子)和 LWin & Space(含有除修饰符$#外的明确前缀的键盘钩子)。

当脚本关闭时会自动重新启用输入.

相关

SendMode, Send, Click, MouseMove, MouseClick, MouseClickDrag

示例

BlockInput, on
Run, notepad
WinWaitActive, Untitled - Notepad
Send, {F5} ; 粘贴时间和日期
BlockInput, off