Electron中关闭窗口时如何从渲染进程获取数据?
解决方案
方法1:通过webContents.executeJavaScript直接读取渲染进程属性
主进程可以借助BrowserWindow的webContents.executeJavaScript方法,在close事件中异步读取渲染进程window.modelIsDirty的值,再根据该值判断是否弹出确认对话框。
修改后的主进程代码:
mainWindow.on('close', async function (event) { // 异步读取渲染进程的modelIsDirty状态 const isDirty = await mainWindow.webContents.executeJavaScript('window.modelIsDirty'); if (!isDirty) { // 模型未修改,直接关闭窗口 return; } // 模型已修改,弹出确认对话框 const { dialog } = require('electron'); const choice = dialog.showMessageBoxSync(this, { type: 'question', buttons: ['Yes', 'No', 'Cancel'], title: 'Closing', message: 'Do you want to save changes?' }); if (choice === 0) { // 选择Yes,执行保存逻辑 // 比如调用渲染进程的保存方法 await mainWindow.webContents.executeJavaScript('window.saveModel()'); // 保存完成后窗口自动关闭,若保存失败可在此处阻止关闭 } else if (choice === 2) { // 选择Cancel,阻止窗口关闭 event.preventDefault(); } // choice ===1 为No,直接关闭窗口无需额外操作 });
注意:executeJavaScript是异步方法,需用async/await处理,确保先获取到dirty状态再执行后续逻辑。
方法2:通过IPC通信维护dirty状态
如果需要实时同步模型状态,可让渲染进程通过IPC主动通知主进程dirty状态变化,主进程保存该状态后,在close事件中直接使用。
- 渲染进程代码:
window.modelIsDirty = false; // 模型修改时触发,通知主进程状态变更 function onModelChanged() { window.modelIsDirty = true; window.electron.ipcRenderer.send('update-model-dirty', true); } // 模型保存后重置状态并通知主进程 async function saveModel() { // 执行保存逻辑 window.modelIsDirty = false; window.electron.ipcRenderer.send('update-model-dirty', false); }
- 主进程代码:
const { ipcMain } = require('electron'); let isModelDirty = false; // 监听渲染进程的状态更新 ipcMain.on('update-model-dirty', (event, dirty) => { isModelDirty = dirty; }); mainWindow.on('close', function (event) { if (!isModelDirty) { return; } const { dialog } = require('electron'); const choice = dialog.showMessageBoxSync(this, { type: 'question', buttons: ['Yes', 'No', 'Cancel'], title: 'Closing', message: 'Do you want to save changes?' }); if (choice === 0) { // 通知渲染进程执行保存 mainWindow.webContents.send('save-model'); // 可等待渲染进程保存完成后再关闭,或让渲染进程保存后主动触发窗口关闭 } else if (choice === 2) { event.preventDefault(); } }); // 监听渲染进程的保存完成事件 ipcMain.on('model-saved', () => { mainWindow.close(); });
这种方式适合需要频繁更新状态的场景,避免close事件中异步读取可能带来的延迟。
内容的提问来源于stack exchange,提问作者BennoDual
相关产品推荐
相关产品推荐

