Electron - IPC - 在窗口间传输数据

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

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

我所做的是使用IPC send首先将数据从 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");
const ipcRenderer = require("electron").ipcRenderer;
ipcRenderer.on('notes2', function(event, data) {
    // this function never gets called
    console.log(data);
});

有人能解释一下我做错了什么吗?先感谢了!

2个回答

8
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);
});

2
谢谢!我之前尝试使用webContents.send,但无法使其正常工作。未捕获的异常: TypeError: 无法读取未定义的属性'webContents'我是这样创建主窗口的 let mainWindow = new BrowserWindow({...})所以不确定为什么mainWindow是未定义的:S - Harmonic
1
有趣。将它放入app.on('ready', createWindows)中可以使其工作。因此,我将您的答案标记为正确。感谢您的帮助! - Harmonic
1
@harmonic,我有这个问题,但是我无法解决它。我该怎么办? - Saleh Mosleh
1
我遇到的错误是 无法读取未定义的属性“sender”,但仅在Windows 10上出现... - Daniel Lizik
我用示例回答这个问题。 - Moh_beh

2

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

关键在于,如果你想让 renderer 之间进行直接的 ipc 对话,则需要知道彼此的 getCurrentWebContents().id

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

main.js

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

    global.mainWindow = mainWindow;

    ...
}

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

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
});

(可选) 步骤三:发送数据并接收回复

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");
});

这是更好的。https://dev59.com/-Kf1oIgBc1ULPQZFthry#69103017 - Moh_beh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接