Создание окна и его скрытие при нажатии кнопки закрытия - PullRequest
1 голос
/ 16 апреля 2019

Я пытался создать приложение в трее, в котором есть две опции: первая создает окно браузера, а вторая закрывает процесс в трее.После написания базовой структуры, которую я протестировал, приложение в трее закрылось, когда я закрыл главное окно браузера.Покопавшись в интернете, я обнаружил this .

После этой части все становится странным.Если я запускаю свое электронное приложение в Visual Studio, я могу открывать / показывать и скрывать приложение 4-6 раз, после чего оно зависает.Если я запускаю приложение с npm start, я могу открыть и скрыть его только два раза, после чего оно полностью зависает.Я задавался вопросом, была ли это проблема с Ubuntu, поэтому я загрузил виртуальную машину Windows и установил электронный модуль для 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 предложил мне этот вопрос , но его решение тоже не помогло.Есть ли правильный способ сделать это? (я также задавал подобный вопрос здесь, если это поможет)

1 Ответ

0 голосов
/ 17 апреля 2019

Я не уверен, какая именно у вас проблема.

Помимо исправленной теперь if (windowshown = true){, которая должна читать ==, значок в трее исчезает через некоторое время.

Вероятно, это связано с тем, что вы объявляете переменную в готовом обработчике. Поэтому через некоторое время он удаляется сборщиком мусора.

Если вы переместите объявление в основной части (на том же уровне, что и mainWindow), лоток останется на месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...