【问题标题】:In Electron version 1.X, how can I emit an event from one BrowserWindow and consume it in another BrowserWindow?在 Electron 版本 1.X 中,如何从一个 BrowserWindow 发出事件并在另一个 BrowserWindow 中使用它?
【发布时间】:2016-06-02 12:41:46
【问题描述】:

在 Electron 版本 1.X 中,如何从一个 BrowserWindow 发出事件并在另一个 BrowserWindow 中使用它?

我使用的是 Electron 版本 1.2.1。

【问题讨论】:

  • 您可以使用ipcRenderer 发送到主进程,并且回复可以转到您应该在主进程中拥有的另一个窗口实例引用。咨询github.com/electron/electron/blob/master/docs/api/…
  • @OwenAyres 您应该将您的评论转换为答案。
  • 谢谢@VadimMacagon - 忘了这个,昨天没时间!添加了一些应该涵盖此解决方案的代码
  • @OwenAyres 谢谢,最后我使用 'ipcRenderer.send()' 从渲染进程发出事件,并使用 'ipcMain.on()' 在主进程中监听事件.
  • @Kosmo 很好,很高兴你有一些工作,这就是我在发表评论时的想法,基本上是现在发布的答案所涵盖的内容,以防其他人正在寻找这个!

标签: javascript chromium electron


【解决方案1】:

您可以做到这一点的一种方法是使用ipcRendererBrowserWindow 实例和main 进程之间进行通信。例如,在主进程中,您可能会有如下内容:-

const electron          = require('electron');
const app               = electron.app;
const BrowserWindow     = electron.BrowserWindow;
let mainWindow, subWindow;

mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    fullscreen: true
});

mainWindow.loadURL('file://' + __dirname + '/../index.html');

subWindow = new BrowserWindow(); // etc

electron.ipcMain
    .on('myMainMessage', function (event, data) {
        // data can be passed from browser window
        subWindow.webContents.send('myPassedMessage', data);
    });

然后,在第一个 mainWindow 实例中,您可以使用 ipcRenderer 将消息放在一起,如下所示:-

var electron = require('electron');
var ipc = electron.ipcRenderer;

ipc.send('myMainMessage', {
    property: 'someValue'
});

在您的另一个窗口实例中,您将有一些 JavaScript 来监听另一个触发器。像这样的东西:-

var electron = require('electron');
var ipc = electron.ipcRenderer;

ipc.on('myPassedMessage', function (event, data) {
    console.log(data); // will be from the mainWindow instance
});

更多信息请咨询the docs on the ipcRenderer section

【讨论】:

    【解决方案2】:

    使用 webContents 从 child_window 到其 parent_window 的通信示例:

    • 在父窗口内:

      const BrowserWindow = require('electron').remote.BrowserWindow;
      
      var child_window = new BrowserWindow({ ... });
      
      child_window.webContents.on("event", function(arg1, arg2){
          console.log(arg1, arg2); // this will print inside parent_window devtools console
      });
      
    • 在 child_window 内:

      require('electron').remote.getCurrentWebContents().emit("event", "hello", "world");
      

    使用此解决方案而不是IPC 的主要优点是这些例程链接到child_window 的webContents 的本地上下文。因此,如果 child_window 关闭并删除其 BrowserWindow 对象,则这些例程将被删除。

    您还可以使用相同的系统从 parent_window 到 child_window 进行通信。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-20
      • 2017-05-04
      • 2019-03-21
      • 2016-11-19
      相关资源
      最近更新 更多