Учебник по Electron.js

Приложение в единственном экземпляре

Иногда нужно, чтобы приложение работало в единственном экземпляре, например, при добавлении значка в область уведомлений. В этом случае нужно запросить блокировку с помощью метода requestSingleInstanceLock() объекта приложения:

const lockApp = app.requestSingleInstanceLock();

Если блокировка не получена, то приложение уже запущено. В этом случае для текущего объекта приложения следует вызвать метод quit():

if (!lockApp) {
   app.quit();
}

Чтобы привлечь внимание пользователя, следует передать фокус на уже запущенное окно приложения. Сделать это можно внутри обработчика события second-instance:

else {
   app.on('second-instance', (e, commandLine, workingDir) => {
      if (win) {
         if ( win.isMinimized() ) win.restore();
         win.focus();
      }
   });
}

Полный текст программы приведен в листинге 6.3.

Листинг 6.3. Содержимое файла C:\book\e1\main.js

const { app, BrowserWindow } = require('electron');
let win = null;
const lockApp = app.requestSingleInstanceLock();
if (!lockApp) {
   app.quit();
}
else {
   app.on('second-instance', (e, commandLine, workingDir) => {
      if (win) {
         if ( win.isMinimized() ) win.restore();
         win.focus();
      }
   });
   function createWindow() {
      win = new BrowserWindow({
         width: 400,
         height: 300
      });
      win.webContents.loadFile('index.htm');
      win.on('closed', () => {
         win = null;
      });
   }
   
   app.whenReady().then( () => {
      createWindow();
      app.on('activate', () => {
         if (BrowserWindow.getAllWindows().length === 0) {
            createWindow();
         }
      });
   } );
   
   app.on('window-all-closed', () => {
      if (process.platform !== 'darwin') {
         app.quit();
      }
   });
}