【问题标题】:Electron - close renderer from main handler电子 - 从主处理程序关闭渲染器
【发布时间】:2022-01-30 02:28:18
【问题描述】:

TLDR:从主窗口(或渲染器本身)关闭渲染器窗口的最佳方式。

我在 X 个不可见的渲染器窗口之间拆分一个进程。当渲染器完成其工作时,我希望它向主进程发送一个事件,然后关闭。现在我有

//invisibleRenderer.js
doStuff().then(() => {
  ipcRenderer.invoke('finish');
}

关闭窗口的最佳方法是什么?它在 ipcMain.handle 中吗?我不知道用哪个 id 调用哪个方法。

ipcMain.handle('finish', (event, args) => {
  //do what? event.frameId, event.processId, event.sender.id...
})

【问题讨论】:

  • 不完全。这里的区别是我在 ipcMain 内做,所以我不知道要使用哪个 id。事件对象中有 3 个不同的 id(event.frameId、event.processId、event.sender.id)。现在我正在这样做,但我不知道它是否是最好的:let win = BrowserWindow.getAllWindows().find(x=>x.webContents.id == event.sender.id);

标签: javascript electron


【解决方案1】:

您可以使用BrowserWindow.fromId(event.sender.id) 获取对发起 IPC 调用的窗口的引用,如this question 中所示。

这在主进程中运行良好。以下示例打开 5 个窗口并加载相同的内容。每个渲染器脚本调用都会选择一个随机延迟(以模拟一些工作),然后将finish 消息发送到主进程。在那里,主进程使用 event.sender.id 获取 BrowserWindow 引用并关闭相应的窗口。

app.js

const {app, BrowserWindow, ipcMain} = require("electron");

const windows = [];

app.on("ready", function() {
    for (let i=0; i<5; i++) {
        let win;
        win = new BrowserWindow( {
            width: 300,
            height: 300,
            x: i*100,
            y: i*100,
            webPreferences: {
                nodeIntegration: true,
                contextIsolation: false
            },
        });

        win.loadURL(`file://${__dirname}/index.html`);
        windows.push(win);
    }
});

ipcMain.handle("finish", (event, args) => {
    const win = BrowserWindow.fromId(event.sender.id);
    win.close();
});

index.html

<html>
<body>
Renderer
</body>
<script type="text/javascript" src="renderer.js"></script>
</html>

renderer.js

const {ipcRenderer} = require("electron");
// Simulate some work by choosing a random delay..
const delay = Math.round(Math.random()*10000);
setTimeout(() => ipcRenderer.invoke("finish"), delay);

【讨论】:

    猜你喜欢
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 2017-03-25
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多