navigator.keyboard.lock() 无法捕获Esc、Alt+Tab等系统级热键,仅能在全屏且有用户手势时锁定指定键位的输入焦点,但不拦截操作系统直接处理的保留键。

不能通过 navigator.keyboard.lock() 捕获 Esc、Alt+Tab、Ctrl+Shift+Esc 等系统级热键。
keyboard.lock() 的实际能力范围
navigator.keyboard.lock() 是 Web Keyboard API 的一部分,用于在全屏或沉浸式模式下锁定键盘输入焦点,防止系统快捷键(如 Alt+Tab)意外退出当前上下文。但它不提供拦截或重定义系统热键的能力,尤其是以下几类按键:
- Esc 键(在全屏 PWA 中默认退出全屏,无法被 JavaScript 阻止)
- Alt+Tab / Cmd+Tab(窗口/应用切换)
- Ctrl+Shift+Esc / Cmd+Option+Esc(任务管理器)
- Win/Logo 键、Cmd 键等操作系统保留键
这些按键由操作系统直接处理,浏览器无权劫持或屏蔽——这是安全沙箱的基本设计原则。
Esc 键在 PWA 全屏中的行为与应对方式
当用户按 Esc,PWA 进入全屏后会触发 document.exitFullscreen() 并触发 fullscreenchange 事件。你无法阻止该行为,但可以:
- 监听
fullscreenchange,检测是否被意外退出,并立即尝试重新进入全屏(需用户手势触发,且现代浏览器限制频繁调用) - 在 UI 中明确提示“请勿按 Esc”,或用自定义按钮替代退出操作
- 对关键流程(如考试、演示)使用
screen.orientation.lock("landscape")配合视觉引导,降低误触概率
keyboard.lock() 的正确使用场景
它真正有用的地方是:在已获得键盘焦点的全屏/沉浸式会话中,防止其他窗口抢走输入权。例如 VR/AR Web 应用、高帧率交互画布:
- 调用前需满足:页面处于全屏、有用户手势(如点击)、且 document.hasFocus() === true
- 成功后可接收 keydown/keyup 事件,包括组合键(如 Ctrl+S),但依然收不到 Esc 的 keydown(只收到 beforeunload 或 fullscreenchange)
- 示例代码片段:
if ("keyboard" in navigator) {
try {
await navigator.keyboard.lock(["KeyA", "ArrowUp"]); // 可选指定键位子集
console.log("键盘已锁定(受限于支持的键)");
} catch (err) {
console.warn("keyboard.lock 失败:", err.name);
}
}
替代方案与现实建议
若目标是“减少系统干扰”,应转向更可行的策略:
- 使用
display: "standalone"或"minimal-ui"manifest 配置,让 PWA 更像原生应用,降低用户调用系统快捷键的倾向 - 借助
beforeinstallprompt引导用户添加到主屏幕,提升沉浸感 - 在关键界面禁用右键、F12、缩放等非系统级干扰(用 CSS + event.preventDefault)
- 接受 Esc 的退出行为,在退出后自动保存状态、展示恢复入口
强行对抗系统快捷键既不可靠,也违背 Web 平台的设计哲学。优先优化体验流,比试图封锁按键更有效。

















