当我隐藏mainWindow时,mainWindow.on('close')被调用多次

问题描述 投票:0回答:2

我做了一个基本的电子托盘,当点击其中一个选项时打开一个窗口。我检查是否用bool打开BrowserWindow并创建或显示/隐藏窗口。

const contextMenu = Menu.buildFromTemplate([
      { label: 'Open configuration menu', click:() => {
        console.log("called createwin");
        createwin();
      }

而createwin是:

function createwin(){
  if (windowshown == false) {
  mainWindow = new BrowserWindow({
    width: 1000,
    height: 800,
    webPreferences: {
      nodeIntegration: true
    }
  })
  console.log("Window has been created")
  windowshown = true;
mainWindow.loadFile('configuration.html')
}
else {
  mainWindow.show(); 
  console.log("Window has been shown");
} 
  mainWindow.on('close', (event) => {
        event.preventDefault();
        console.log("Window has been hidden");
        mainWindow.hide();
    })
}

当我隐藏/显示它创建的窗口4次时,我的控制台看起来像这样:


called createwin
Window has been created
window has been hidden
called createwin
Window has been shown
window has been hidden
window has been hidden
called createwin
Window has been shown
window has been hidden
window has been hidden
window has been hidden
called createwin
window has been hidden
window has been hidden
window has been hidden
window has been hidden

在第四次之后,它只是停止响应。我甚至做不到

      mainWindow.removeAllListeners('close');
      mainWindow.close()
      mainWindow = null
      app.quit();

我的问题是我的应用程序在第四次隐藏窗口后完全没有响应。

更新:如果我从npm start而不是visual studio代码的调试器开始,隐藏窗口后应用程序将完全无响应。

我在这里错过了什么?

node.js electron
2个回答
0
投票

无论何时调用close,都会向createwin事件添加一个新的事件监听器。然后在窗口关闭时运行每个事件处理程序,从而产生重复的window has been hidden

在创建新窗口时,您只需要添加一次事件处理程序:

function createwin(){
    if (windowshown == false) {
        mainWindow = new BrowserWindow({
            width: 1000,
            height: 800,
            webPreferences: {
                nodeIntegration: true
            }
        })
        console.log("Window has been created")
        windowshown = true;
        mainWindow.loadFile('configuration.html')

        mainWindow.on('close', (event) => {
            event.preventDefault();
            console.log("Window has been hidden");
            mainWindow.hide();
        })
    }
    else {
        mainWindow.show();
        console.log("Window has been shown");
    }
}

1
投票

因为你在'close'事件中调用.close(),它进入递归模式并且“永远”循环。我觉得.close()方法只是一个事件触发器,你必须处理关闭进程,所以,不要在事件中调用.close(),只保留空行。

例:

  mainWindow.removeAllListeners('close');
  // mainWindow.close() delete this line
  mainWindow = null
  app.quit();
© www.soinside.com 2019 - 2024. All rights reserved.