BlockInput屏蔽/锁定鼠标键盘函数

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

Private Declare Function BlockInput Lib "user32" (ByVal fEnable As Long) As Long

Private Sub Command1_Click()
BlockInput (5) '锁定
End Sub

Private Sub Timer1_Timer()
BlockInput (0) '解锁
End Sub

用法: BlockInput, Mode


Mode 1: 是下列的一个单词:

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

Off: 输入被重新启用。

Mode 2 (在 Windows 9x 上无效): 此模式独立于其他两个模式进行操作。例如,BlockInput On 将继续阻止输入直到 BlockInput Off 被使用,即使下面的某个单词也在生效。

Send: 用户的鼠标和键盘输入在 Send 或 SendRaw 命令正进行时将被忽略(仅对传统的 SendEvent mode(发送事件模式) 而言)。此参数阻止用户的键击去扰乱模拟的键击流程。当 Send 命令结束时,输入被重新启用(除非仍然被之前使用的一个 BlockInput On 阻止)。

Mouse: 用户的鼠标和键盘输入在 Click 、MouseMove 、MouseClick 或 MouseClickDrag 命令正进行时被忽略(仅对传统的 SendEvent mode 而言)。此参数阻止用户的鼠标移动和点击去扰乱模拟的鼠标事件。当鼠标命令结束时,输入被重新启用(除非仍然被之前使用的一个 BlockInput On 阻止)。

SendAndMouse: 上面两种参数模式的组合。

Default: 关掉 Send 和 Mouse 两种参数模式,但不改变当前阻止的输入状态。例如,如果 BlockInput On 当前生效中,使用 BlockInput Default 不会将它关掉。

Mode 3 (在 Windows 9x 上无效;需要 v1.0.43.11+): 此模式独立于其他两个模式进行操作。例如,如果 BlockInput On 和 BlockInput MouseMove 同时生效中,鼠标移动将被一直阻止直到两个模式都关掉。

MouseMove: 鼠标指针不会对用户的物理的鼠标移动做出反应而移动(DirectInput 程序可能是一个例外)。当脚本第一次使用此命令时, mouse hook(鼠标钩子) 被装载(如果它还没被装载的话)。另外,脚本变成 persistent(持久的),意味着应该使用 ExitApp 命令来终止它。鼠标钩子会继续处于装载状态直到下次使用了 Suspend 或 Hotkey 命令,在那时如果不被任何热键或热字串需要的话,它将被移除(见 #Hotstring NoMouse)。

MouseMoveOff: 允许用户移动鼠标指针。


优先于 BlockInput,最好使用 SendMode Input 或 SendMode Play 以便键击和鼠标点击变得不可中断。这是因为不像 BlockInput,那些模式在发送期间不会抛弃用户输入的东西;而是将这些键击缓存起来并在之后发送。避免用 BlockInput 同样避开了像下面段落中描述的需要解决粘滞按键的情况。

如果在用户按住按键时 BlockInput 变为激活状态,可能导致这些按键"卡住"。这种情况可以通过在启用 BlockInput 前等待按键被松开来避免发生。


输入阻止即刻自动地关闭每当一个 ALT 事件发送时(之后重新启用)。

下面的表格显示了 BlockInput 的表现如何随着 Windows 的版本而改变;不过,由于一个 Windows API 的特性,在任何一个平台上按 Ctrl+Alt+Del 将重新启用输入。

操作系统  "BlockInput" 效果 
 
Windows 95  无效。 
Windows 98/Me 用户输入被阻止并且 AutoHotkey 不能模拟输入。 
Windows NT 4 (without ServicePack 6)  无效。 
Windows NT 4 (with ServicePack 6)  用户输入被阻止,不过 AutoHotkey 能模拟键击和鼠标点击。 
Windows 2000/XP 用户输入被阻止,不过 AutoHotkey 能模拟键击和鼠标点击。 


Windows 98/Me: 虽然在 BlockInput 期间脚本不能在那些操作系统上发送鼠标点击和键击,但像 WinMove 这样的命令仍能起作用。ControlSend 也许也能工作。

某些类型的 hook hotkeys 当 BlockInput 打开时仍能被触发。包括像 "MButton" (鼠标钩子) 和 "LWin & Space" (用明确的前缀而不是修饰符 "$#" 的键盘钩子)这样的例子.

当脚本关闭时,输入被自动地重新启用。

相关命令
SendMode, Send, Click, MouseMove, MouseClick, MouseClickDrag