通过app.requestSingleInstanceLock来控制应用的多开,返回值为boolean。

此方法的返回值表示你的应用程序实例是否成功取得了锁。如果它取得锁失败,你可以假设另一个应用实例已经取得了锁并且仍旧在运行,并立即退出。

即:如果当前进程是应用程序的主要实例,则此方法返回true,同时你的应用会继续运行。如果当它返回false,如果你的程序没有取得锁,它应该立刻退出,并且将参数发送给那个已经取到锁的进程。

在macOS上,当用户尝试在Finder打开您的应用程序的第二个实例时,系统会通过发出open-file和open-url事件来自动强制执行单个实例,但是当用户在命令行启动应用程序时,系统的单实例机制将被绕过,您必须手动调用此方法来确保单实例。

在第二个实例启动事激活主实例窗口的示例:

 1const {app} = require('electron')
 2let myWindow = null
 3 
 4const additionalData = {myKey:'myValue'}
 5const gotTheLock = app.requestSingleInstanceLock(additionalData)
 6 
 7if(!gotTheLock){
 8    app.quit()
 9}else{
10    app.on('second-instance',(event,commandLine,workingDirectory,additionalData)=>{
11        //输入从第二个实例中接收到的数据
12        console.log(additionalData)
13        //有人试图运行第二个实例,我们应该关注我们的窗口
14        if(myWindow){
15            if(myWindow.isMinimized()) myWindow.restore()
16            myWindow.focus()        
17        }
18    })
19    //创建myWindow,加载应用的其余部分,etc...
20    app.whenReady().then(()=>{
21        myWindow = createWindow()    
22    })
23}
个人笔记记录 2021 ~ 2025