【问题标题】:mainWindow.on('close') gets called more than one time when I hide mainWindow当我隐藏 mainWindow 时,mainWindow.on('close') 被多次调用
【发布时间】:2019-04-01 03:45:05
【问题描述】:

我制作了一个基本的电子托盘,当单击其中一个选项时会打开一个窗口。我检查我是否用布尔值打开了 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 代码的调试器开始,隐藏窗口后,应用程序将完全无响应。

我在这里错过了什么?

【问题讨论】:

  • 不要在close事件中调用mainWindow.hide();
  • 在不关闭我的应用程序的情况下如何摆脱那个窗口?
  • 致电mainWindow.hide();,然后在close 事件中进行您需要做的任何清理工作。

标签: node.js electron


【解决方案1】:

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

示例:

  mainWindow.removeAllListeners('close');
  // mainWindow.close() delete this line
  mainWindow = null
  app.quit();

【讨论】:

  • 实际上第一行删除了它的监听器,所以它不能像你说的那样循环
【解决方案2】:

每当您调用createwin 时,您都会向close 事件添加一个新的事件侦听器。然后在关闭窗口时运行每个事件处理程序,从而导致重复的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");
    }
}

【讨论】:

  • 那行得通。正如你所说,我正在调用多个听众。现在,当我第五次关闭(隐藏)窗口时,我的应用程序挂起。
  • 我无法重现您观察到的行为 - 我只做了 10 次,然后就变得无聊了。你确定不是代码的其他部分搞砸了吗?
  • 对我来说似乎是个问题。当我在 Visual Studio 的调试器上启动应用程序时,我可以显示和隐藏窗口 2-3 次,当我使用 npm start 启动应用程序时,我只能打开一次。我什至尝试了 No Grabbing 的方法并对 mainprocess 进行了 ipc 回调以隐藏窗口。结果是一样的。看来我得重新开始了。
  • 我只需要在mainWindow.on('close', (event) => { 的末尾添加return 0; 编辑:虽然我可以打开和关闭它超过4 次,但它会在一段时间后停止响应。
  • 更新:仅当我从 Visual Studio 代码运行它时才会发生这种情况,当我通过 npm start 运行它时问题仍然存在
猜你喜欢
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 2021-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多