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