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

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事件中直接使用。

  1. 渲染进程代码:
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);
}
  1. 主进程代码:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 03:30:51