如何在Electron.js中完全禁用所有全局及应用内键盘快捷键?
Electron 完全禁用所有键盘快捷键可行方案
你之前尝试的方案无效的核心原因是:globalShortcut仅用于操作系统全局级别的快捷键,Electron内置菜单快捷键、Chromium默认快捷键(刷新、开控制台、缩放等)均不受其管控,所以方向存在偏差。以下是可落地的实现方案:
1. 核心拦截逻辑:通过before-input-event钩子拦截所有按键
该钩子在Chromium处理按键事件前触发,是唯一能覆盖所有内置快捷键的拦截入口,配置在BrowserWindow的webContents上即可:
const { app, BrowserWindow, Menu } = require('electron') app.whenReady().then(() => { const mainWindow = new BrowserWindow({ width: 1200, height: 800, webPreferences: { // 可选:直接禁用开发者工具,避免F12触发 devTools: false, nodeIntegration: true, contextIsolation: false } }) // 所有键盘事件优先走该拦截逻辑 mainWindow.webContents.on('before-input-event', (event, input) => { // 拦截所有带修饰键(Ctrl/Command/Alt)的组合键、功能键(F1-F12等) const hasModifier = input.control || input.meta || input.alt || input.functionKey const isFKey = /^F\d+$/.test(input.key) if (hasModifier || isFKey) { event.preventDefault() return } // 如需完全禁用所有按键,直接在此处统一调用event.preventDefault()即可 }) // 2. 移除默认应用菜单,消除菜单绑定的所有快捷键 Menu.setApplicationMenu(null) mainWindow.loadFile('index.html') })
2. 可选配置:快捷键白名单
如果需要保留部分常用快捷键(如复制粘贴),可在拦截逻辑中增加白名单判断:
mainWindow.webContents.on('before-input-event', (event, input) => { const hasModifier = input.control || input.meta || input.alt || input.functionKey const isFKey = /^F\d+$/.test(input.key) // 白名单规则 const allowList = [ { control: true, key: 'c' }, // Ctrl+C { control: true, key: 'v' }, // Ctrl+V { meta: true, key: 'c' }, // Command+C(适配Mac) { meta: true, key: 'v' } // Command+V(适配Mac) ] const isAllowed = allowList.some(rule => { return Object.entries(rule).every(([key, value]) => input[key] === value) }) if ((hasModifier || isFKey) && !isAllowed) { event.preventDefault() } })
注意事项
- 如果你应用存在多个子窗口,需要为每个子窗口的
webContents都绑定相同的before-input-event监听 - 如业务需要保留开发者工具,无需设置
devTools: false,只需在拦截逻辑中单独匹配input.key === 'F12'的规则拦截即可
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

