【问题标题】:Creating a window and hiding it when close button is clicked创建一个窗口并在单击关闭按钮时将其隐藏
【发布时间】:2019-09-06 23:56:37
【问题描述】:

我一直在尝试创建一个托盘应用程序,它有两个选项,第一个创建浏览器窗口,第二个关闭托盘进程。 编写完基本结构后,我对其进行了测试,当我关闭主浏览器窗口时,托盘应用程序退出了。上网一查,发现this

在这部分之后事情开始变得奇怪。如果我用 Visual Studio 启动我的电子应用程序,我可以打开/显示和隐藏应用程序 4-6 次,然后它就会冻结。如果我用npm start启动应用程序,我只能打开和隐藏两次,然后它就完全冻结了。 我想知道这是否是 ubuntu 的问题,所以我启动了一个 Windows VM 并安装了 windows 的电子模块作为对该项目的依赖项。 如果在 Windows 上使用相同的项目,我可以创建/显示和隐藏应用程序 14-16 次,即使我使用 npm start 启动它,之后托盘图标就会消失。 这是我的代码

const {app, BrowserWindow, Menu, Tray, ipcMain} = require('electron');

let mainWindow;
let windowshown = false;
let eventcount = 0;

app.on('ready', createWindow)

function createWindow () {
      let tray = null
      tray = new Tray('path/to/image.jpg')
      const contextMenu = Menu.buildFromTemplate([
        { label: 'Open blank window', click:() => {
          console.log("called createwin");
          createwin();
                                                  }
        },
      {label: 'Try to quit', click: (item, window, event) => {
        if (windowshown == true){
          mainWindow.removeAllListeners('close');
          mainWindow = null
      }
        app.quit();
      }},
    ])
    tray.setContextMenu(contextMenu)
    }


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

    }
    else {
        mainWindow.show();
        eventcount++;
        console.log("Window has been shown " + eventcount + " time(s)");
    }
  }

这是 ubuntu 上的输出

called createwin
Window has been shown 1 time(s)
Window has been hidden
.
.
.
called createwin
Window has been shown 10 time(s)
Window has been hidden
(tray app becomes unresponsive so I stop the debugger)
Window has been hidden

Windows 会产生类似的结果,但我可以打开/关闭应用程序超过 16 次。 在写这篇文章时,stackoverflow 建议我 this question 但它的解决方案也没有帮助。 有正确的方法吗? (I also asked a similar question here if that helps)

【问题讨论】:

  • 您发布的代码与输出不对应。您是否包括了整个minimal reproducible exampleWindow has been hidden 消息不在您的代码中。你希望如何隐藏窗口?关闭窗口会关闭应用程序,您需要覆盖它。还有一个bug:if (windowshown = true){应该是==,否则你在这个时候设置变量!
  • 我不知道该特定行是如何被删除的,但是,这是我在两个系统上使用的代码。也感谢您的提醒,我会修复那个。

标签: node.js electron


【解决方案1】:

我不确定你到底遇到了什么问题。

除了现在更正的if (windowshown = true){ 应该改为==,托盘图标会在一段时间后消失。

这很可能是由于您在准备好的处理程序中声明了变量。因此,它会在一段时间后被垃圾收集器删除。

如果您移动主要部分中的声明(与mainWindow 相同的级别),托盘会粘在周围。

【讨论】:

  • 是的,垃圾收集器就是这样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-23
  • 2018-01-29
  • 2021-05-02
  • 2015-04-07
  • 1970-01-01
相关资源
最近更新 更多