【问题标题】:How to prevent multiple instances of a window in Electron?如何防止 Electron 中的多个窗口实例?
【发布时间】:2020-08-10 01:05:15
【问题描述】:

我正在检查特定时间间隔内的更新。每当更新失败时,我都会显示一个带有错误通知的窗口。问题是每次创建一个新窗口。

我已经试过了

let window = null;

if(window === null) {
    window = new BrowserWindow();
    window.loadURL('notification.html');
}

else {
    window.restore(); // But that is only for minimizing
    // WHAT DO I PUT HERE?
}

【问题讨论】:

  • 你能在点击按钮后杀死一个窗口吗?
  • 是的,但是如果没有人使用该设备几个小时并且它每 10 分钟检查一次更新,那么将有大约 50 个窗口要关闭...
  • 我不明白else 块 - 为什么需要恢复?你不能只为在更新失败的情况下设置的窗口设置一个全局变量。然后当计时器再次触发时,如果设置了全局,则不做任何事情。点击退出错误信息可以关闭并清空全局变量
  • @pushkin 这只是我的第一个想法。我之前尝试过您的解决方案,但是当我手动关闭窗口时,它不会重新出现。只要问题尚未解决,该窗口就应始终重新出现
  • 您希望它在下次计时器运行时重新出现?那么你应该监听窗口“关闭”事件并在窗口关闭时将变量清空,所以下次计时器运行时,它会重新创建窗口

标签: javascript electron


【解决方案1】:

从 Electron 5.0.x 开始,单实例 API 发生了变化。你可以这样使用它。

/** Check if single instance, if not, simply quit new instance */
let isSingleInstance = app.requestSingleInstanceLock()
if (!isSingleInstance) {
  app.quit()
}

// Behaviour on second instance for parent process- Pretty much optional
app.on('second-instance', (event, argv, cwd) => {
  if (window) {
    if (window.isMinimized()) window.restore()
    window.focus()
  }
})

【讨论】:

    【解决方案2】:

    所以我有另一个设置窗口和一个从菜单中打开此窗口的按钮,所以如果用户单击菜单中的那个按钮,它会一次又一次地打开设置。

    10 次点击 = 10 个设置窗口实例。

    所以我按照 if else 来解决这个问题。

    不知道这是不是最好的方法,我也在学习。

    let settingsWindow;
    
    const createSettingsWindow = () => {
    
        if (!settingsWindow) {// If not already opened
                  settingsWindow = new BrowserWindow({
                      width: 500,
                      height: 400,
                  })
                  settingsWindow.loadURL(url.format({
                      pathname: path.join(__dirname, "./src/setting.html"),
                      protocol: 'file',
                      slashes: true,
                      resizable: false,
                  }))
                  settingsWindow.on("closed", () => {
                    settingsWindow = null;
                  })
        } 
        else {
            //Handle Behaviour When Opening again from the menu.
            console.log("Dont Open another instance of about window.")
        }
    }
    

    所以现在当用户点击菜单中的设置按钮时,它会在控制台中打印Dont Open another instance of about window

    【讨论】:

      猜你喜欢
      • 2016-06-25
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 2016-11-29
      • 1970-01-01
      • 2019-09-30
      • 2010-12-24
      • 1970-01-01
      相关资源
      最近更新 更多