Electron 电子-更简单的窗口间通信方式?

Electron 电子-更简单的窗口间通信方式?,electron,Electron,我需要为一个快速的个人项目建立一个基于web的界面,我想使用electron 它本质上是一种游戏缩放应用程序,有很多铃铛和哨子 问题是,我需要一个全屏运行的主窗口,我用OBS捕捉它,并向流行的流媒体服务广播 我还需要另一个窗口,我称之为控制面板,来控制主窗口中我在幕后使用的元素,用于显示图形、播放声音效果、控制视频设置等 如果我将此应用程序编码为web浏览器,我绝对不会有问题,因为我可以从主窗口(window.open)创建辅助窗口,这两个窗口可以轻松地相互引用及其文档 然而,在electron

我需要为一个快速的个人项目建立一个基于web的界面,我想使用electron

它本质上是一种游戏缩放应用程序,有很多铃铛和哨子

问题是,我需要一个全屏运行的主窗口,我用OBS捕捉它,并向流行的流媒体服务广播

我还需要另一个窗口,我称之为控制面板,来控制主窗口中我在幕后使用的元素,用于显示图形、播放声音效果、控制视频设置等

如果我将此应用程序编码为web浏览器,我绝对不会有问题,因为我可以从主窗口(window.open)创建辅助窗口,这两个窗口可以轻松地相互引用及其文档

然而,在electron中,窗口基本上是包含框的。两个窗口之间的通信必须通过ipc传输,基本上作为编码命令,并由主进程进行解释

因此,要从我的控制面板控制元素和实体的负载,我要么必须实现一个复杂的消息传递系统,坦率地说,这似乎是非常不必要的,要么是黑客,我可以简单地使用BrowserWindow.WebContent.executeJavaScript()将javascript命令作为字符串发送到另一个窗口。。。但是很恶心

我也可以在主流程中包含所有的logic-y内容,但这仍然需要一个我没有时间实现的消息传递系统

我想我想知道是否有更好的方法


我只是在想象一个场景,一个开发人员编写了一个web应用程序,它使用多个窗口和大量直接的窗口到窗口通信,现在他们需要将它迁移到electron。。。他们如何才能在不重新编写大量代码的情况下完成这项工作呢?

找到了我的答案,
nativeWindowOpen

main_window = new electron.BrowserWindow({
    webPreferences: {
        nativeWindowOpen: true
    }
});
我现在可以从主窗口使用window.open()并直接来回引用

所以现在我可以做到:

control_panel = window.open("./control_panel.html", "Control Panel", "width=720,height=480")
console.log(control_panel.document)
从打开的窗口:

console.log(window.opener.document)
我可以引用变量和文档元素


我之前搜索stackoverflow等人时,没有发现有人提到这个有用的“nativeWindowOpen”选项,只是通过阅读文档找到的。

找到了我的答案,
nativeWindowOpen

main_window = new electron.BrowserWindow({
    webPreferences: {
        nativeWindowOpen: true
    }
});
我现在可以从主窗口使用window.open()并直接来回引用

所以现在我可以做到:

control_panel = window.open("./control_panel.html", "Control Panel", "width=720,height=480")
console.log(control_panel.document)
从打开的窗口:

console.log(window.opener.document)
我可以引用变量和文档元素

在我之前搜索stackoverflow等人的时候,我找不到任何人提到这个有用的“nativeWindowOpen”选项,只是通过阅读文档找到的