2017-01-12 16 views
0

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

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

Я думаю, что важно отметить один из советов на maxogden/menubarReadme тоже:

Использование mb.on («после того, как создать-окно», обратного вызова) для запуска вещи после того, как вы загрузили приложение

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 ярлык, и перерегистрировать его, чтобы скрыть приложение (при показе), похоже, не работает.

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

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

ответ

2

из строки меню Документов (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() 
});