【问题标题】:Activate Electron app on MacOS using Cmd+tab在 MacOS 上使用 Cmd+tab 激活 Electron 应用程序
【发布时间】:2020-03-31 07:42:34
【问题描述】:

在 MacOS 上的 Electron 应用程序中,如果使用 activate 事件单击 Dock 中的图标,我可以让应用程序显示主窗口:

app.on('activate', () => {

    log.info('activate')
    win.show()
})

当用户使用 Cmd+tab 激活应用程序时,我需要使用哪个事件来显示主窗口? activate 事件未被触发。我正在寻找的行为类似于 GitHub Desktop,其中使用 Cmd+tab 选择应用程序将打开主窗口(如果它不可见)。

【问题讨论】:

  • 这不是 macOS 的标准行为。看看像 Apple 的 Messages 这样的应用程序:如果窗口关闭,当你 CMD-Tab 到应用程序时它不会重新打开。对于像 Slack 这样的 Electron 应用程序也是如此。您应该在“窗口”菜单下提供类似CMD-1 的键盘快捷键来重新打开窗口。
  • 嗨,我很感激,但我并没有要求标准行为——当 Cmd+tab 进入应用程序时,我要求打开主窗口——比如 GitHub Desktop(也是一个 Electron 应用程序)

标签: macos electron


【解决方案1】:

查看 GitHub Desktop 示例,他们似乎通过劫持 BrowserWindow 的 close 事件来自定义此行为。

app/src/main-process/app-window.ts:

    if (__DARWIN__) {
      this.window.on('close', e => {
        if (!quitting) {
          e.preventDefault()
          Menu.sendActionToFirstResponder('hide:')
        }
      })
    }

阻止窗口关闭后,Menu.sendActionToFirstResponder('hide:') 将隐藏整个应用程序,而不是对窗口本身做任何事情。现在,进入应用程序(就像在 macOS 上使用 +H 隐藏的任何应用程序一样)现在将显示它。

请注意,您可能应该添加处理程序以确保应用程序在您尝试实际退出时也关闭。来自 GitHub Desktop repo 上的同一个文件(不确定是什么触发了 IPC 事件,但刚开始使用 before-quit 就可以了)

    let quitting = false
    app.on('before-quit', () => {
      quitting = true
    })

    ipcMain.on('will-quit', (event: Electron.IpcMainEvent) => {
      quitting = true
      event.returnValue = true
    })

查看minimal reproduction Gist 可使用Electron Fiddle 打开。

【讨论】:

  • 嗨@Erick - 感谢您的帮助+清晰的解释和电子小提琴!
  • 确实感谢@Erick。我还有一个跟进:当应用程序在 macOS 上隐藏一段时间后显示时,是否会触发任何事件(或以其他方式知道)?我问是因为我们想做 dmid 所做的完全相同的事情,但我们也想在应用程序显示时恢复任何最小化的窗口。但我没有看到任何app.on('reveal', ...) 或类似的东西。让我知道这是否值得另一个问题。
  • 在我脑海中浮现:win.on('show') 处理程序应该在您以这种方式显示窗口时触发。如果您的其他窗口最小化到停靠栏,您可以像这样为每个窗口添加一个侦听器:win.on('show', () => { BrowserWindow.getAllWindows().forEach(w => w.restore())})
  • @CemSchemel 我相信您正在寻找的是app.on('did-become-active', ...),它会在应用程序切换到时触发。见electronjs.org/docs/latest/api/…我使用这个钩子来显示一个窗口,如果在命令标签到我的应用程序时没有可见的窗口。
猜你喜欢
  • 2012-03-15
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
  • 2016-11-27
  • 1970-01-01
相关资源
最近更新 更多