Electron - IPC - 在Windows

时间:2017-04-19 04:32:14

标签: ipc electron

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

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

我所做的是使用IPC发送,首先将数据从notesWindow发送到主进程,检索主进程上的数据,然后将该数据发送到mainWindow,但是{{1} }无法接收发件人事件。将数据发送到主流程工作正常,但从主流程到浏览器窗口似乎无法正常工作。

  

main.js

mainWindow
  

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

mainWindow.js

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

任何人都可以解释我做错了什么吗?提前谢谢!

2 个答案:

答案 0 :(得分:6)

mainWindow无法接收该事件,因为它未被发送给它。 events.sender.send()中的main.js代码会将数据发回给发送notes事件的人,在这种情况下是noteWindow。因此,notes2事件将被发送回noteWindow而不是mainWindow

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

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

答案 1 :(得分:0)

无需在main.js上设置ipc集线器。这就是我的做法。

这里的关键是,如果您想在renderer之间进行直接ipc对话,他们需要彼此了解getCurrentWebContents().id

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

  

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");
});
相关问题