Вывод приложения electron на передний план с помощью глобального ярлыка (например, Spotlight/Launchy)

Я ищу, чтобы воспроизвести поведение, подобное тому, что Launchy / Quicksilver / Spotlight.

Я хочу иметь приложение electron, которое всегда работает. Когда я нажимаю клавишу быстрого доступа, приложение electron выводится на передний план и фокусируется.

Я понимаю, что модуль globalShortcut может использоваться для привязки ярлыка, однако я не могу понять, как сделать этот ярлык триггером, выводящим приложение на передний план.

любая помощь будет высоко оцененный...

1 ответов


давайте начнем с самого простого случая, а затем построим наше решение, чтобы лучше обрабатывать некоторые крайние случаи.

самый простой возможный случай-показать окно, которое уже открыто при нажатии глобального ярлыка, который мы зарегистрировали.

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();
});

и с этим вы должны иметь базовые функции на месте. Нажмите глобальный ярлык, и появится окно. Отпустите его, нажмите клавиши и наблюдайте за его появлением.