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

bli*_*uck 8 javascript electron

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

我希望有一个始终在运行的电子应用程序.当我点击快捷键时,电子应用程序将被带到前台并进行聚焦.

我知道globalShortcut模块可用于绑定快捷方式,但我无法弄清楚如何使该快捷方式触发器将应用程序带到前台.

任何帮助将非常感激...

小智 18

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

最简单的情况是,只要按下我们注册的全局快捷方式,就会显示一个已打开的窗口.

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.'); }

});
Run Code Online (Sandbox Code Playgroud)

这段代码有一些问题.好消息是,如果窗口已经最小化,它仍然有效.坏消息是,如果窗口关闭,它将无法工作.这是因为关闭最后一个窗口会退出应用程序.游民.(坦率地说,我对此感到有些惊讶 - 但这就是发生的事情.所以,让我们继续吧.)

让我们停止发生这种情况.

app.on('window-all-closed', (event) => {
  event.preventDefault();
});
Run Code Online (Sandbox Code Playgroud)

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

Uncaught Exception:
Error: Object has been destroyed
Run Code Online (Sandbox Code Playgroud)

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

mainWindow.on('close', (event) => {
  event.preventDefault();
  mainWindow.hide();
});
Run Code Online (Sandbox Code Playgroud)

最终结果如下:

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();
});
Run Code Online (Sandbox Code Playgroud)

有了它,您应该具备基本功能.按下全局快捷方式,将出现窗口.关闭它并按下键并再次观看它.