You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅在Electron应用窗口处于焦点时按下指定按键创建新窗口

实现方案

核心实现逻辑

使用Electron原生的before-input-event窗口事件即可实现,该事件仅在对应窗口处于激活聚焦状态时触发,不会全局响应,完全匹配需求。

具体实现代码

主进程代码示例

const { app, BrowserWindow } = require('electron')
let mainWindow

function createMainWindow () {
  mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: true,
      contextIsolation: false // 开启上下文隔离也不影响该事件生效,无需额外适配
    }
  })
  mainWindow.loadFile('index.html')

  // 监听窗口的输入事件,仅窗口聚焦时触发
  mainWindow.webContents.on('before-input-event', (event, input) => {
    // 示例匹配快捷键:Ctrl+N(Windows/Linux)/ Cmd+N(Mac)
    if ((input.control || input.meta) && input.key.toLowerCase() === 'n' && !input.isAutoRepeat) {
      event.preventDefault() // 阻止系统默认行为(如浏览器默认新建标签)
      createNewWindow() // 调用新建窗口逻辑
    }
    // 若要匹配单键,比如F4,直接写 input.key === 'F4' 即可
  })
}

// 新建窗口逻辑
function createNewWindow () {
  const newWin = new BrowserWindow({
    width: 600,
    height: 400
  })
  newWin.loadFile('new-window.html')
}

app.whenReady().then(createMainWindow)
// 常规应用生命周期逻辑省略

上下文隔离适配说明

如果项目开启了官方推荐的contextIsolation: true配置,上述代码无需任何修改,before-input-event是主进程层面的监听事件,不受渲染进程上下文隔离规则影响。

原有方案失效原因说明

  • 渲染进程监听keydown/keyup事件失效:事件会被页面内的输入控件、iframe或者其他冒泡阻止逻辑拦截,仅页面空白处聚焦时才会触发,稳定性极低
  • globalShortcuts是全局触发的设计特性,本身就不符合窗口聚焦才响应的需求
  • 第三方库mousetrap本质是监听DOM事件,和渲染进程直接监听的问题一致,同样存在被拦截的可能

内容的提问来源于stack exchange,提问作者SNOOT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 04:06:03