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

如何修改Electron标题栏文本且不改变Window菜单中的文档名?

解决Electron标题栏与窗口菜单名称不一致的问题

结论

默认的{ role: "windowMenu" }无法实现仅修改标题栏文本、保持菜单中窗口名称不变的需求,必须自定义Window菜单。

原因

Electron的默认Window菜单会自动同步所有已打开窗口的title属性值,当你调用win.setTitle()或win.setDocumentEdited(true)时,窗口标题的变更会被默认菜单自动捕获并更新到窗口列表中,没有提供单独配置的入口。

自定义Window菜单的实现步骤

  1. 创建自定义菜单模板
    手动构建Window菜单的结构,保留默认菜单的核心功能(如最小化、最大化、关闭、窗口切换等),但在生成窗口列表时使用自定义的名称(比如原始文档名,不带“- Edited”后缀)。

    示例代码:

    const { Menu, BrowserWindow } = require('electron');
    
    function buildWindowMenu() {
      const template = [
        {
          label: 'Window',
          submenu: [
            { role: 'minimize' },
            { role: 'zoom' },
            { type: 'separator' },
            // 自定义窗口切换列表
            ...getCustomWindowList(),
            { type: 'separator' },
            { role: 'front' }
          ]
        }
      ];
    
      return Menu.buildFromTemplate(template);
    }
    
    function getCustomWindowList() {
      const windows = BrowserWindow.getAllWindows();
      return windows.map((win, index) => {
        // 用窗口自定义属性存储原始文档名,避免受标题栏修改影响
        const windowName = win.originalTitle || 'Untitled';
        return {
          label: windowName,
          type: 'radio',
          checked: win.isFocused(),
          click: () => {
            win.focus();
          }
        };
      });
    }
    
  2. 监听窗口状态更新菜单
    当窗口数量变化、焦点切换时,重新生成并设置菜单,确保窗口列表的准确性:

    // 主进程中监听窗口焦点变化
    BrowserWindow.on('focus', () => {
      Menu.setApplicationMenu(buildWindowMenu());
    });
    
    BrowserWindow.on('blur', () => {
      Menu.setApplicationMenu(buildWindowMenu());
    });
    
    // 新窗口创建后更新菜单
    app.on('browser-window-created', () => {
      Menu.setApplicationMenu(buildWindowMenu());
    });
    
  3. 单独管理标题栏文本
    继续用win.setTitle()设置带“- Edited”的标题栏文本,同时给每个窗口添加originalTitle属性存储原始文档名,供自定义菜单调用:

    // 创建窗口时
    const win = new BrowserWindow({ /* 窗口配置 */ });
    win.originalTitle = 'MyDocument.txt'; // 存储原始名称
    win.setTitle(`${win.originalTitle} - Edited`); // 设置标题栏文本
    
    // 编辑状态切换时更新标题
    function toggleEditedState(win, isEdited) {
      win.setTitle(isEdited ? `${win.originalTitle} - Edited` : win.originalTitle);
    }
    

注意事项

  • 自定义菜单时尽量保留系统默认的操作逻辑(比如Mac平台的窗口切换快捷键、Windows平台的窗口排列选项),避免破坏用户操作习惯。
  • 多平台适配时,要注意不同系统菜单的差异,比如macOS的Window菜单通常包含“Bring All to Front”选项,需在模板中对应添加。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:20:07