mainWindow.on ('close') вызывается более одного раза, когда я скрываю mainWindow - PullRequest
0 голосов
/ 31 марта 2019

Я сделал базовый электронный лоток, который открывает окно при нажатии одной из его опций. Я проверяю, открыл ли я BrowserWindow с помощью bool и создаю или показываю / скрываю окно.

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.

Что мне здесь не хватает?

Ответы [ 2 ]

1 голос
/ 31 марта 2019

Поскольку вы вызываете .close() внутри события 'close', оно переходит в рекурсивный режим и зацикливается "навсегда".У меня такое ощущение, что метод .close() является единственным триггером события, и вам приходится иметь дело с процессом закрытия, поэтому вместо вызова .close() внутри события оставляйте только нулевую строку.

Пример:

  mainWindow.removeAllListeners('close');
  // mainWindow.close() delete this line
  mainWindow = null
  app.quit();
0 голосов
/ 31 марта 2019

Вы добавляете новый прослушиватель событий к событию 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");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...