如何修改Electron标题栏文本且不改变Window菜单中的文档名?
解决Electron标题栏与窗口菜单名称不一致的问题
结论
默认的{ role: "windowMenu" }无法实现仅修改标题栏文本、保持菜单中窗口名称不变的需求,必须自定义Window菜单。
原因
Electron的默认Window菜单会自动同步所有已打开窗口的title属性值,当你调用win.setTitle()或win.setDocumentEdited(true)时,窗口标题的变更会被默认菜单自动捕获并更新到窗口列表中,没有提供单独配置的入口。
自定义Window菜单的实现步骤
创建自定义菜单模板
手动构建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(); } }; }); }监听窗口状态更新菜单
当窗口数量变化、焦点切换时,重新生成并设置菜单,确保窗口列表的准确性:// 主进程中监听窗口焦点变化 BrowserWindow.on('focus', () => { Menu.setApplicationMenu(buildWindowMenu()); }); BrowserWindow.on('blur', () => { Menu.setApplicationMenu(buildWindowMenu()); }); // 新窗口创建后更新菜单 app.on('browser-window-created', () => { Menu.setApplicationMenu(buildWindowMenu()); });单独管理标题栏文本
继续用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
相关产品推荐
相关产品推荐

