使用全局快捷方式将电子应用程序带到前台(如 Spotlight/Launchy)
Bringing an electron app to foreground with a global shortcut (like Spotlight/Launchy)
我希望复制类似于 Launchy/Quicksilver/Spotlight 的行为。
我想要一个始终 运行 的电子应用程序。当我按下快捷键时,电子应用程序会被带到前台并聚焦。
我知道 globalShortcut 模块可用于绑定快捷方式,但我不知道如何让该快捷方式触发将应用程序带到前台。
任何帮助将不胜感激...
让我们从最简单的情况开始,然后构建我们的解决方案以更好地处理一些边缘情况。
最简单的情况是在按下我们注册的全局快捷方式时显示已经打开的 window。
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.'); }
});
虽然这段代码有一些问题。好消息是,如果 window 已最小化,它仍然有效。坏消息是,如果 window 已经关闭,它将无法工作。这是因为关闭最后一个 window 会退出应用程序。无赖。 (坦率地说,我对此感到有点惊讶——但事实就是如此。所以,让我们继续吧。)
让我们阻止这种情况发生。
app.on('window-all-closed', (event) => {
event.preventDefault();
});
好的,我们的应用程序并没有退出,而是崩溃了。
Uncaught Exception:
Error: Object has been destroyed
好的,好的。这是因为 window 在关闭时被销毁。所以,我们不要关闭它。让我们隐藏它,好吗?在 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();
});
至此,您应该具备了基本功能。你按下你的全局快捷键,window 出现。关闭它并按下按键并观察它重新出现。
我希望复制类似于 Launchy/Quicksilver/Spotlight 的行为。
我想要一个始终 运行 的电子应用程序。当我按下快捷键时,电子应用程序会被带到前台并聚焦。
我知道 globalShortcut 模块可用于绑定快捷方式,但我不知道如何让该快捷方式触发将应用程序带到前台。
任何帮助将不胜感激...
让我们从最简单的情况开始,然后构建我们的解决方案以更好地处理一些边缘情况。
最简单的情况是在按下我们注册的全局快捷方式时显示已经打开的 window。
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.'); }
});
虽然这段代码有一些问题。好消息是,如果 window 已最小化,它仍然有效。坏消息是,如果 window 已经关闭,它将无法工作。这是因为关闭最后一个 window 会退出应用程序。无赖。 (坦率地说,我对此感到有点惊讶——但事实就是如此。所以,让我们继续吧。)
让我们阻止这种情况发生。
app.on('window-all-closed', (event) => {
event.preventDefault();
});
好的,我们的应用程序并没有退出,而是崩溃了。
Uncaught Exception:
Error: Object has been destroyed
好的,好的。这是因为 window 在关闭时被销毁。所以,我们不要关闭它。让我们隐藏它,好吗?在 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();
});
至此,您应该具备了基本功能。你按下你的全局快捷键,window 出现。关闭它并按下按键并观察它重新出现。