使用全局快捷方式(如 Spotlight/Launchy)将电子应用程序带到前台

Bringing an electron app to foreground with a global shortcut (like Spotlight/Launchy)

本文关键字:应用程序 前台 Launchy 快捷方式 全局 Spotlight      更新时间:2023-09-26

我希望复制类似于Launchy/Quicksilver/Spotlight的行为。

我想要一个始终运行的电子应用程序。当我按下快捷键时,电子应用程序被带到前台并聚焦。

我知道 globalShortcut 模块可用于绑定快捷方式,但是我不知道如何使该快捷方式触发器将应用程序带到前台。

任何帮助将不胜感激...

让我们从最简单的情况开始,然后构建我们的解决方案以更好地处理一些边缘情况。

最简单的情况是显示一个窗口,每当按下我们注册的全局快捷方式时,该窗口都已打开。

const path = require('path');
const { app, BrowserWindow, globalShortcut } = require('electron');
let mainWindow = null;
app.on('ready', () => {
  mainWindow = new BrowserWindow();
  mainWindow.loadURL(path.join(__dirname, 'index.html'));
  const shortcut = globalShortcut.register('Control+Space', () => {
    mainWindow.show();
  });
  if (!shortcut) { console.log('Registration failed.'); }
});

不过,这段代码存在一些问题。好消息是,如果窗口最小化,它仍然有效。坏消息是,如果窗口已关闭,它将不起作用。这是因为关闭最后一个窗口会退出应用程序。无赖。(坦率地说,我对此有点惊讶——但事实就是如此。所以,让我们一起去吧。

让我们阻止这种情况发生。

app.on('window-all-closed', (event) => {
  event.preventDefault();
});

好的,我们的应用程序不会退出,但它崩溃了。

Uncaught Exception:
Error: Object has been destroyed

好吧,好吧。这是因为窗口在关闭时会被破坏。所以,我们不要关闭它。让我们隐藏它,好吗?在app.on('ready', () => {…}) 中,添加以下内容:

mainWindow.on('close', (event) => {
  event.preventDefault();
  mainWindow.hide();
});

最终结果如下所示:

const path = require('path');
const { app, BrowserWindow, globalShortcut } = require('electron');
let mainWindow = null;
app.on('ready', () => {
  mainWindow = new BrowserWindow();
  mainWindow.loadURL(path.join(__dirname, 'index.html'));
  const shortcut = globalShortcut.register('Control+Space', () => {
    mainWindow.show();
  });
  if (!shortcut) { console.log('Registration failed.'); }
  mainWindow.on('close', (event) => {
    event.preventDefault();
    mainWindow.hide();
  });
});

app.on('window-all-closed', (event) => {
  event.preventDefault();
});

有了这个,您应该拥有基本功能。按全局快捷方式,窗口将出现。关闭它并按按键并观看它重新出现。