Глобальный ярлык Electron для переключения отображения/скрытия строки меню

Я пытаюсь добавить глобальный ярлык в свое приложение Electron, который будет показывать/скрывать его. Мое приложение представляет собой панель меню, созданную с использованием maxogden/menubar и React.

У меня есть следующий код. Для краткости я пропустил пару битов, но вот как я настроил глобальные ярлыки.

Я думаю, важно также отметить один из советов по maxogden/menubar Readme:

Используйте mb.on('after-create-window', callback) для запуска вещей после загрузки вашего приложения.

const { globalShortcut } = require('electron');
const keyboardShortcuts = {
  open: 'CommandOrControl+Shift+g',
  close: 'CommandOrControl+Shift+g'
}

menu.on('after-create-window', () => {
  globalShortcut.register(keyboardShortcuts.open, () => {
    menu.window.show();
  });
});

menu.on('after-show', () => {
  globalShortcut.unregister(keyboardShortcuts.open);
  globalShortcut.register(keyboardShortcuts.close, () => {
    menu.window.hide();
  });
});

menu.on('focus-lost', () => {
  globalShortcut.unregister(keyboardShortcuts.close);
  globalShortcut.register(keyboardShortcuts.open, () => {
    menu.window.show();
  });
});

После первого открытия строки меню мой ярлык регистрируется и будет работать для отображения приложения. Однако код, который я реализовал для unregister ярлыка и перерегистрации его, чтобы скрыть приложение (при отображении), похоже, не работает.

Я не уверен, что мой код для перерегистрации ярлыка настроен в правильном обработчике событий, то есть after-show и focus-lost. У меня такое ощущение, что эти обработчики событий, с которыми я работаю, связаны непосредственно с моим menu, а не menu.window. Это объясняет, почему перерегистрация ярлыка не происходит, но я не уверен.

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


person Pete    schedule 12.01.2017    source источник


Ответы (1)


Из документов строки меню (https://github.com/maxogden/menubar) экземпляр строки меню предоставляет следующие методы:

{
  app: the electron require('app') instance,
  window: the electron require('browser-window') instance,
  tray: the electron require('tray') instance,
  positioner: the electron-positioner instance,
  setOption(option, value): change an option after menubar is created,
  getOption(option): get an menubar option,
  showWindow(): show the menubar window,
  hideWindow(): hide the menubar window
}

Использование menu.showWindow() и menu.hideWindow() вместо menu.window.show() и menu.window.hide() будет работать.

Я также предлагаю вам использовать встроенные события для управления своим состоянием, упрощая код и реализацию:

const { globalShortcut } = require('electron');

let isShown = false;
menu
  .on('after-show', () => { isShown = true })
  .on('after-hide', () => { isShown = false })
  .on('focus-lost', () => { isShown = false });

globalShortcut.register('CommandOrControl+Shift+g', () => {
  isShown ? menu.hideWindow() : menu.showWindow()
});
person yotamlaufer    schedule 12.01.2017