如何访问Electron应用程序中的多个mainWindow实例?

如何访问Electron应用程序中的多个mainWindow实例?,electron,Electron,如何创建具有多个主窗口实例的功能正常的electron应用程序?这是一个非常简单的应用程序,主窗口只有两个按钮。一个用于创建新的mainWindow实例,另一个用于关闭当前窗口 // main.js const { app, ipcMain, BrowserWindow } = require('electron') let mainWindow; function main () { mainWindow = new BrowserWindow({ width: 500,

如何创建具有多个主窗口实例的功能正常的electron应用程序?这是一个非常简单的应用程序,主窗口只有两个按钮。一个用于创建新的mainWindow实例,另一个用于关闭当前窗口

// main.js
const { app, ipcMain, BrowserWindow } = require('electron')

let mainWindow;

function main () {
  mainWindow = new BrowserWindow({
    width: 500,
    height: 400,
    tabbingIdentifier: 'todoTab',
    show: false,
    webPreferences: {
      nodeIntegration: true
    }
  })
  mainWindow.loadFile('renderer/index.html');
  mainWindow.once('ready-to-show', () => {
    mainWindow.setTitle("Todo-" + mainWindow.id)
    mainWindow.show();
  })
  mainWindow.mergeAllWindows();
}

app.on('ready', main);

ipcMain.on('newListWindow', main);

ipcMain.on('closeWindow', function(event){
  mainWindow.close();
});
  • 在上面的文件中,我将mainWindow设置为全局变量
  • 如果打开多个窗口,添加tabbingIdentifier属性并链接mergeAllWindows()方法将自动在显示中创建多个选项卡
  • Electron为每个mainWindow实例分配了一个id。如果只有一个实例打开,则id为1。为简单起见,我将mainWindow标题设置为“Todo-”+mainWindow.id(因此第一个窗口为Todo-1,如果打开第二个窗口为Todo-2)
  • 单击newListWindow按钮时,将调用“main”函数来创建mainWindow的新实例
  • 按下closeWindow按钮时,主窗口实例将关闭
带有两个按钮的HTML文件(仅缩写为body元素)


上面的代码将创建多个Todo窗口,并将它们显示在不同的选项卡上。将显示每个列表标题(Todo-1、Todo-2等)。问题是,最后打开的是唯一活动的。因此,如果我打开三个TODO,然后转到其中任何一个并单击“关闭”按钮,则无论我在哪个TODO中,只有第三个窗口将关闭。然后,如果我试图关闭另外两个,说对象被破坏了,那么它们将抛出一个错误。这是有道理的。那么,如果我所在的实例选项卡就是我关闭的实例选项卡,我该如何编写代码呢。当我关闭它时,我所在的下一个选项卡将成为有效的mainWindow对象?

您可能只需要在
'closeWindow'
回调中处理聚焦的Browser窗口

使用静态方法


Pergy的答案按要求运行,但我也会发布这个答案,因为这是我实际使用的答案,而且我找不到其他关于如何做到这一点的文档。差别很小,但这似乎更直接:

ipcMain.on('closeWindow', function(event) {
  mainWindow = BrowserWindow.getFocusedWindow();
  mainWindow.close();
})

差不多就是这样了。唯一的问题是,只有关闭最后一个打开的窗口,它才能工作。因此,如果我打开了三个mainWindow实例,并试图关闭第一个或第二个实例,那么它将什么也不做。这解决了部分问题,但我想在单击“关闭”按钮时关闭第一个和第二个窗口。对代码稍加修改就可以做到这一点。如果我将mainWindow设置为聚焦窗口,而不是const current,然后将mainWindow.close()设置为我想要的效果。如果你想改变你的答案,我会接受。IDK你是如何测试它的,但我经历了“只有关闭最后一个打开的窗口才能工作。因此,如果我打开了三个主窗口实例,我尝试关闭第一个或第二个实例,它将什么也不做”——7.1.1我错了,你的方法行得通。他们也像我描述的那样。好吧,那么,我接受你的回答。
// renderer/index.js
const { ipcRenderer } = require('electron')

document.getElementById('new-list-btn').addEventListener('click', () => {
  ipcRenderer.send('newListWindow');
});

document.getElementById('close-btn').addEventListener('click', () => {
  ipcRenderer.send('closeWindow');
});
ipcMain.on('closeWindow', function(event) {
  const current = BrowserWindow.getFocusedWindow()
  if (current) current.close()
})
ipcMain.on('closeWindow', function(event) {
  mainWindow = BrowserWindow.getFocusedWindow();
  mainWindow.close();
})