Electron - IPC - 在窗口之间发送数据

Posted

技术标签:

【中文标题】Electron - IPC - 在窗口之间发送数据【英文标题】:Electron - IPC - sending data between windows 【发布时间】:2017-09-15 03:14:02 【问题描述】:

在主进程中,我创建了一个名为mainWindow 的窗口。单击按钮后,我创建了一个名为 notesWindow 的新 browserWindow

我想做的是将数据从notesWindow发送到mainWindow

我所做的是使用IPC发送首先将数据从notesWindow发送到主进程,检索主进程上的数据,然后将数据发送到mainWindow,但是mainWindow无法接收到发件人事件。将数据发送到主进程可以正常工作,但从主进程到 browserWindow 似乎不起作用。

main.js

const ipcMain = require('electron').ipcMain;

ipcMain.on('notes', function(event, data) 
      console.log(data) // this properly shows the data
      event.sender.send('notes2', data);
);

noteWindow.js

const ipcRenderer = require('electron').ipcRenderer;
ipcRenderer.send('notes', "new note");

mainWindow.js

const ipcRenderer = require("electron").ipcRenderer;
ipcRenderer.on('notes2', function(event, data) 
    // this function never gets called
    console.log(data);
);

谁能解释我做错了什么?提前致谢!

【问题讨论】:

【参考方案1】:

mainWindow 无法接收该事件,因为它没有被发送给它。 main.js 中的events.sender.send() 代码会将数据发送回发送notes 事件的人,在本例中为noteWindow。所以notes2 事件被发送回noteWindow 而不是mainWindow

要将notes2 事件发送到mainWindow,请查看webContents.send()。这允许主进程通过事件将数据发送到特定窗口。在对main.js 进行一些修改后,它看起来类似于:

ipcMain.on('notes', function(event, data) 
    mainWindow.webContents.send('notes2', data);
);

【讨论】:

谢谢!我之前尝试过使用 webContents.send 但无法正常工作。 Uncaught Exception: TypeError: Cannot read property 'webContents' of undefined 我制作了这样的 mainWindow let mainWindow = new BrowserWindow(...) 所以不确定为什么 mainWindow 未定义:S 有趣。将其放入app.on('ready', createWindows) 可以使其工作。因此,我将您的答案标记为正确。感谢您的帮助! @harmonic ,我有这个问题,但我无法解决。我该如何解决? 我得到的错误是cannot read property "sender" of undefined,但仅限于 Windows 10... 我用例子来回答这个问题。 ***.com/questions/69103016/…【参考方案2】:

main.js 上无需设置 ipc hub。以下是我的做法。

这里的关键是,如果你想在renderer 之间进行直接的 ipc 对话,他们需要互相认识getCurrentWebContents().id

第一步:创建一个主窗口全局对象

main.js

function createWindow() 
    mainWindow = new BrowserWindow(...);

    global.mainWindow = mainWindow;

    ...

第 2 步:向主窗口发送数据(并接收)

noteWindow.js

const ipc = require("electron").ipcRenderer;
ipc.sendTo(
          getGlobal("mainWindow").webContents.id,
          "ChannelForMainWindow",
          data,
          web_component.id // for main window to send back
        );

mainWindow.js

ipc.on("ChannelForMainWindow", (e, data, web_component_id) => 
    // do something
);

(可选)第 3 步:发回数据(并同时接收)

noteWindow.js

让我们为主窗口回复添加监听器(如果有的话)

const ipc = require("electron").ipcRenderer;

ipc.on("ChannelForNoteWindow", e => 
    ...
);

ipc.sendTo(
          getGlobal("mainWindow").webContents.id,
          "ChannelForMainWindow",
          data,
          web_component.id // for main window to send back
        );

mainWindow.js

ipc.on("ChannelForMainWindow", (e, data, web_component_id) => 
    // do something

    //send data back
    ipc.sendTo(web_component_id, "ChannelForNoteWindow");
);

【讨论】:

这样更好。 ***.com/questions/69103016/…

以上是关于Electron - IPC - 在窗口之间发送数据的主要内容,如果未能解决你的问题,请参考以下文章

从 Electron Container IPC Channel 接收数据时,Change Detection 会间歇性工作

electron窗口相关操作(放大缩小退出,可拖动,可resize等)

Electron(基于Vue)中使用IPC

Electron(基于Vue)中使用IPC

04.electron-(使用remove模块及安全策略)

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