如何用 AutoHotkey 3 分钟锁住键盘:防误触完整指南(含白名单与紧急解锁)
【免费下载链接】AutoHotkeyAutoHotkey - macro-creation and automation-oriented scripting utility for Windows.项目地址: https://gitcode.com/gh_mirrors/au/AutoHotkey
直播时被观众起哄按下了 Win 键、游戏里凑过来帮忙的队友误触了全屏切换——这类键盘误触,用 AutoHotkey 键盘锁定功能 3 分钟就能防住:一条 BlockInput 命令锁死输入,再留一个热键随时解锁。
两种高频翻车现场
先确认你有没有这些问题:
- 演示/直播:误按 Win 键弹出桌面,或 Alt+F4 直接关掉投屏软件
- 游戏:旁人误按快捷键切出全屏,整局报废
两者的共同点是:你需要"默认全锁、少数键放行、随时能收回"。AutoHotkey 的BlockInput命令正好覆盖这三点。
🔒 3 分钟锁住键盘:最小可用脚本
把下面内容保存为kb_lock.ahk(AutoHotkey v1 语法),右键运行即可:
#Persistent #SingleInstance Force IsLocked := false ; ScrollLock:切换 锁定/解锁 ScrollLock:: IsLocked := !IsLocked if IsLocked BlockInput, On else BlockInput, Off Menu, Tray, Tip, 键盘%s, IsLocked ? "已锁定" : "已解锁" return ; Ctrl+Alt+Q:紧急解锁 ^!q:: IsLocked := false BlockInput, Off Menu, Tray, Tip, 键盘已解锁 return三条关键命令,各管一件事:
BlockInput, On:调用系统 API 阻塞来自键盘和鼠标的输入,窗口收不到任何按键#SingleInstance Force:保证只跑一个实例,避免多份脚本互相覆盖锁定状态Menu, Tray, Tip:托盘悬浮提示,一眼看清当前是锁着还是开着
注意一个细节:被锁的是"外部输入",脚本自身的热键和Send发送的按键不受影响——这正是 ScrollLock 还能解锁、^!q还能救场的原因。
30 秒看懂锁的底层:低级键盘钩子
低级键盘钩子,白话说就是:每按一个键,系统先把按键派发给钩子程序过目,钩子说"拦下",按键就到不了任何窗口。AutoHotkey 仓库里这条链路分布在几个文件:
- source/hook.cpp:负责装钩子。独立线程中调用
SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeybdProc, ...)安装全局低级键盘钩子,回调LowLevelKeybdProc返回 1 时该按键被吞掉 - source/keyboard_mouse.cpp:
BlockInput命令的实现处,OurBlockInput调用系统 API 的同时更新内部标志 - source/globaldata.cpp:
g_BlockInput、g_BlockMouseMove等全局开关变量定义在这里,脚本改的就是它们 - source/script.h:
BlockInput第二参数的解析逻辑,可选值有On/Off/Send/Mouse/SendAndMouse等——比如Send只挡脚本注入的按键,MouseMove只挡鼠标移动
保留音量键和 Esc:白名单写法
BlockInput挡外部输入、不挡脚本自己Send出的按键,于是"放行个别键"有了标准解法——拦截后重发:
; 放在脚本末尾:被锁时,这几个键照样能用 ~*Volume_Up:: Send {Volume_Up} ~*Volume_Down:: Send {Volume_Down} ~*Escape:: Send {Escape} return前缀里~表示透传、*表示不等松键。演示场景可以把白名单换成Escape和F9;给孩子用的"儿童模式"则可以放行整个数字键区,其余照锁。
⏱️ 加一个 5 分钟自动解锁
防止锁了忘记开:
; 在 ScrollLock:: 的锁定分支里,BlockInput, On 之后加一行: SetTimer, AutoUnlock, -300000 ; 负数=一次性,300000ms 后触发 ; 脚本末尾加定时器标签 AutoUnlock: BlockInput, Off Menu, Tray, Tip, 键盘已解锁(自动) return⚠️ 避坑清单
- 别把 Ctrl+Alt+Del 当解锁键写进脚本:源码注释明确写了它被拦截在钩子更低的层级(键盘驱动层),脚本根本绑不到它。反过来,这恰恰是天然保险阀——无论脚本怎么写,你总能进安全桌面,锁不死
- 游戏若通过 DirectInput/XInput 读原始输入,
BlockInput未必起效,上生产前务必实测 - 低级钩子在每次按键时都会执行回调,锁定逻辑保持"几行代码"级别,别塞重逻辑
- 一定要加托盘
Tip或ToolTip做状态指示,忘状态比误触更烦人 - 脚本退出时系统会自动释放
BlockInput,不用担心进程崩溃后键盘永久失联
下一步:让锁更聪明
- 用
SetTimer轮询按键空闲时间,实现"人离开键盘自动上锁" - 把白名单键存成配置文件,启动时加载,一个热键切换"演示/游戏/儿童"三套预设
- 想研究独立锁键工具,可参考 source/hook.cpp 中的钩子线程与回调结构(仓库为只读,仅供阅读);需要本地查看源码时执行:
git clone https://gitcode.com/gh_mirrors/au/AutoHotkey
【免费下载链接】AutoHotkeyAutoHotkey - macro-creation and automation-oriented scripting utility for Windows.项目地址: https://gitcode.com/gh_mirrors/au/AutoHotkey
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考