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

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 中使用它?

我正在使用 Electron 版本 1.2.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'
});

在您的其他 window 实例中,您将有一些 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 了解更多信息。

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

  • 里面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 进行通信。