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 会间歇性工作