# BlockInput

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

    BlockInput, OnOff
    BlockInput, SendMouse
    BlockInput, MouseMove  ; [v1.0.43.11+]

## 参数

OnOff

  此模式无条件地阻塞所有用户输入. 指定下列单词的其中一个:

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

  Off: 重新启用输入.

  [v1.1.30+]: 可以分别使用十进制值 1 和 0 代替 On 和 Off.

SendMouse

  此模式仅在执行特定的发送和/或鼠标命令时阻塞用户输入. 指定下列单词的其中一个:

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

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

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

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

MouseMove [v1.0.43.11+]

  此模式仅阻止鼠标光标移动. 指定下列单词的其中一个:

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

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

## 备注

所有这三种 BlockInput 模式(OnOff, SendMouse 和 MouseMove) 都是独立运行的. 例如, `BlockInput On` 会继续阻塞输入直到使用了 `BlockInput Off`, 即使 SendMouse 中的一个单词也有效. 另一个例子是, 如果 `BlockInput On` 和 `BlockInput MouseMove` 都有效, 鼠标移动将被阻塞, 直到它们都被关闭.

注意: OnOff 和 SendMouse 模式将在 UAC 开启或脚本不是以管理员权限运行的时候失效. 更多详情, 请参阅 FAQ.

比起 BlockInput, 通常优先考虑使用 `SendMode Input` 或 `SendMode 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 开启时通过发送 F5 粘贴时间/日期. 注意, BlockInput 可能只在脚本以管理员身份运行的情况下工作.

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

dftg