【问题标题】:Enforce single instance of electron app on Windows, but make a launcher click open new window在 Windows 上强制执行电子应用程序的单个实例,但让启动器单击打开新窗口
【发布时间】:2020-03-28 08:42:48
【问题描述】:

我想为我的电子应用程序强制执行单一实例。当用户单击 Windows 上的应用程序快捷方式图标时,我想强制执行单个实例,但在发生这种情况时仍会在主实例上打开一个新窗口。

所有其他当前解决方案似乎只是退出新实例并重新关注当前实例。

  const singleInstanceLock = app.requestSingleInstanceLock();
  if (!singleInstanceLock) {

    app.exit();
  } else {
    app.focus();
  }

  app.on('second-instance', (_event: Electron.Event, argv: string[]) => {

     app.focus();
  
     // code to open up second window lives here. As far as I can tell, it doesnt get called
  });

【问题讨论】:

  • 嗨,为了清楚起见,一次应该只有一个实例,但可以有多个窗口。当用户尝试打开另一个实例时,实例会退出,而已经打开的实例会创建一个新窗口?
  • 没错。我试过按照这里的例子:github.com/electron/electron/blob/master/docs/api/… - 在第二个实例上,我从主实例打开一个新窗口。但由于某种原因,这似乎没有发生,应用程序正在退出。
  • 我明白了,当您说应用程序正在退出时,您的意思是两个实例都在退出,还是已经打开的实例正在退出?您还介意包含您的requestSingleInstanceLock 代码吗?
  • 我将代码添加到问题中。
  • 已经打开的实例正在退出,启动的新实例也是如此,所以在尝试启动第二个实例后我最终没有启动实例

标签: javascript electron


【解决方案1】:

app.exit(); 是一种更严厉的退出应用程序的方法,它会退出所有 Electron 实例,而不仅仅是当前实例。

尝试改用app.quit()

另外,我会单独重新排列您的代码,如下所示:

const singleInstanceLock = app.requestSingleInstanceLock();
if (!singleInstanceLock) {

  app.quit();
} else {
  app.on('second-instance', (_event: Electron.Event, argv: string[]) => {

     app.focus();

     // Code to open up second window goes here.
  });
}

将您的第一个 app.focus() 替换为 app.on('second-instance'

这是因为您在应用程序第一次启动时正在运行 app.requestSingleInstanceLock()(应该如此),但是执行 app.focus() 不会做任何事情,因为应用程序刚刚打开,并且不会有任何窗口集中注意力。

【讨论】:

  • 进行了这些更改。两个应用程序实例仍在退出,所以它必须是其他东西触发了初始的主实例在尝试打开第二个实例时也退出。
  • 在似乎可能退出应用程序的所有路径上添加大量日志语句,但我就是不知道它关闭的原因。
  • @Stuart Huh,我不知道为什么它会为你退出。你能发布你的整个脚本吗?或者如果只是相关部分(窗口创建、实例锁定、焦点事件等)太大。
猜你喜欢
  • 2014-12-21
  • 2020-11-14
  • 2011-04-28
  • 2012-11-25
  • 2019-10-07
  • 1970-01-01
  • 1970-01-01
  • 2018-01-23
  • 1970-01-01
相关资源
最近更新 更多