在 Electron 中的两个渲染器进程之间进行通信

Posted

技术标签:

【中文标题】在 Electron 中的两个渲染器进程之间进行通信【英文标题】:Communicating between two renderer processes in Electron 【发布时间】:2016-12-08 12:07:32 【问题描述】:

我正在编写一个 Eletron 程序。在程序中有一个由主进程(main.js)创建的索引窗口。在此窗口中有一个文件(图像)列表。当我单击该列表中的一个文件时,我想启动第二个显示该文件的窗口。 第二个窗口由索引窗口 (index.js) 的渲染器进程启动。 index-window的renderer进程和第二个window的renderer进程如何通信?

代码:

从 main.js 中的主进程创建索引窗口:

let win;

function createWindow()
  // Create the browser window.

  win = new BrowserWindow(width: 1024, height: 768, minWidth: 800, minHeight: 600, show: false, icon: 'files/images/icon.png');

  win.loadURL(`file://$__dirname/files/html/index.html`);
  win.once('ready-to-show', () => 
    win.show()
  )

  // Emitted when the window is closed.
  win.on('closed', () => 
    win = null;
  );

app.on('ready', createWindow);

在 index.html 中启动 index.js(renderer 进程):

<script src="../javascript/index.js"></script>

在 index.js 中,function create_sprite_window() 被调用,它创建了一个子窗口:

const fs = require('fs');
const path = require('path');
const BrowserWindow = require('electron').remote
let child_windows = [];


function create_child_window(URL, width, height)
  let rem_win = require('electron').remote.getCurrentWindow();
  let new_win = new BrowserWindow(width: width, height: height, minWidth: 400, minHeight: 300, show: false, parent: rem_win, minimizable: true, maximizable: true, skipTaskbar: true);
  child_windows[child_windows.length] = new_win;
  console.log(child_windows);
  new_win.loadURL(URL);
  new_win.once('ready-to-show', () => 
    new_win.show()
  )
  return new_win;

function create_sprite_window()
  new_win = create_child_window(`file://$__dirname/../html/sprite_manager.html`, 800, 400);


子窗口存储在数组child_windows中。

是否可以将图像的路径发送到第二个窗口,或者编辑第二个窗口的&lt;img&gt;标签(将第二个窗口中&lt;img&gt;标签的源设置为图像getElementById.src = path;) 来自索引窗口?

【问题讨论】:

【参考方案1】:

我自己找到了答案。 为了在第二个渲染器窗口中显示正确的图像,我向包含图像路径的 URL 添加了一个 GET 参数。

【讨论】:

它可能有效,但不是电子的最佳解决方案。一种方法是使用 ipcMainipcRenderer 模块。这样,您可以从索引文件渲染器发送文件主进程的路径。然后主进程可以使用该文件路径打开一个新窗口 ***.com/questions/44972482/…***.com/questions/41225572/…***.com/questions/43859394/…***.com/questions/47416799/…

以上是关于在 Electron 中的两个渲染器进程之间进行通信的主要内容,如果未能解决你的问题,请参考以下文章

使用electron进行原生应用的打包---主进程与渲染进程之间的通信

electron渲染进程与主进程通信

Electron - 解决渲染器进程中的电子模块问题

Electron 主进程和渲染进程

Electron 主进程和渲染进程

Electron中通过ipcMain和ipcRender实现主进程和渲染进程之间的相互通信