乐闻世界logo
搜索文章和话题

How to prevent multiple instances in Electron

4 个月前提问
3 个月前修改
浏览次数110

1个答案

1

在Electron应用程序中,可能要确保应用程序只运行一个实例。为了防止多个实例的出现,您可以使用app模块的requestSingleInstanceLock方法和second-instance事件。以下是如何实现它的步骤:

  1. 在应用程序的主进程中,尝试获取单实例锁。
  2. 如果不能获取锁(意味着已经有一个实例在运行),则通常会立即退出当前实例。
  3. 如果成功获取了锁,则监听second-instance事件,当尝试打开另一个实例时,会触发并允许您对原有实例进行操作,例如将窗口带到前台。

以下是如何实现这个逻辑的代码示例:

javascript
const { app, BrowserWindow } = require('electron'); let mainWindow; function createWindow() { mainWindow = new BrowserWindow({ width: 800, height: 600, webPreferences: { nodeIntegration: true } }); mainWindow.loadFile('index.html'); mainWindow.on('closed', () => { mainWindow = null; }); } // 这个方法应该在模块的生命周期内只被调用一次 const gotTheLock = app.requestSingleInstanceLock(); if (!gotTheLock) { // 如果没有获取到锁,说明已经有一个实例在运行了,可以直接退出 app.quit(); } else { // 当运行第二个实例时, 会触发这个事件 app.on('second-instance', (event, commandLine, workingDirectory) => { // 当运行第二个实例时,应该聚焦到主窗口 if (mainWindow) { if (mainWindow.isMinimized()) mainWindow.restore(); mainWindow.focus(); } }); // Electron已经准备好了,可以创建浏览器窗口了 // 部分API只能在该事件发生后使用 app.on('ready', createWindow); } app.on('window-all-closed', () => { // 在macOS上,除非用户用Cmd + Q确认退出,否则绝大部分应用及其菜单栏会保持激活 if (process.platform !== 'darwin') { app.quit(); } }); app.on('activate', () => { // 在macOS上,当点击dock图标并且没有其他窗口打开时,通常在应用程序中重新创建一个窗口 if (mainWindow === null) { createWindow(); } });

在上述代码中,我们首先使用requestSingleInstanceLock方法尝试获取单实例锁。如果返回false,则说明已有实例在运行,并调用app.quit()退出程序。如果成功获取了锁,我们监听second-instance事件,当用户尝试打开另一个实例时,会执行事件处理函数,在这里通常是激活已有的主窗口。

这样,您的Electron应用程序就配置为只运行一个实例,并在尝试打开第二个实例时将焦点移回到已有的窗口。

2024年6月29日 12:07 回复

你的答案