【问题标题】:Electron - IPC - sending data between windowsElectron - IPC - 在窗口之间发送数据
【发布时间】: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);
});

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

【问题讨论】:

    标签: ipc electron


    【解决方案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...
    • 我用例子来回答这个问题。 stackoverflow.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");
    });
    

    【讨论】:

    猜你喜欢
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 2021-09-13
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多