Node.js 创建窗口并在单击“关闭”按钮时将其隐藏

Node.js 创建窗口并在单击“关闭”按钮时将其隐藏,node.js,electron,Node.js,Electron,我一直在尝试创建一个托盘应用程序,它有两个选项,第一个选项创建浏览器窗口,第二个选项关闭托盘进程。 在编写了基本结构之后,我对其进行了测试,当我关闭主浏览器窗口时,托盘应用程序退出。当我在互联网上翻找时,我发现 在这一部分之后,事情开始变得奇怪。如果我用visual studio启动我的electron应用程序,我可以打开/显示和隐藏该应用程序4-6次,然后它会冻结。如果我用npm start启动应用程序,我只能打开和隐藏它两次,然后它就会完全冻结。 我想知道这是否是ubuntu的问题,所以我启

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

在这一部分之后,事情开始变得奇怪。如果我用visual studio启动我的electron应用程序,我可以打开/显示和隐藏该应用程序4-6次,然后它会冻结。如果我用npm start启动应用程序,我只能打开和隐藏它两次,然后它就会完全冻结。 我想知道这是否是ubuntu的问题,所以我启动了一个Windows虚拟机,并安装了electron module for 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建议我,但它的解决方案也没有帮助。 有合适的方法吗?

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

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

这可能是因为您在ready处理程序中声明了变量。因此,一段时间后垃圾回收会将其删除


如果您移动主部件中的声明(与主窗口的级别相同),托盘将粘住。

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

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

这可能是因为您在ready处理程序中声明了变量。因此,一段时间后垃圾回收会将其删除


如果在主部件中移动声明(与
main窗口的级别相同)
),托盘将粘住。

您发布的代码与输出不一致。您是否包含了整个代码?
窗口已被隐藏
消息不在您的代码中。您希望如何隐藏窗口?关闭窗口将关闭应用程序,您需要覆盖它。此外,还有一个错误:
if(windowshown=true){
应该是
==
,否则你在这一点上设置了变量!我不知道那一行是如何被删除的,但是,在这里,这是我在两个系统上使用的代码。同样感谢你的提醒,我会修复那一行。你发布的代码与输出不一致。你包括了整个吗?
窗口已经隐藏了n
消息不在您的代码中。您希望如何隐藏窗口?关闭窗口会关闭应用程序,您需要覆盖它。此外,还有一个错误:
如果(windowshown=true){
应该是
==
,否则你就在这里设置了变量!我不知道那一行是怎么被删除的,但是,在这里,这是我在两个系统上使用的代码。同样感谢大家的提醒,我会解决这个问题。是的,垃圾收集器就是这样。是的,垃圾收集器就是这样。