Javascript 用于切换菜单栏显示/隐藏的全局快捷方式

Javascript 用于切换菜单栏显示/隐藏的全局快捷方式,javascript,reactjs,keyboard-shortcuts,electron,menubar,Javascript,Reactjs,Keyboard Shortcuts,Electron,Menubar,我正在尝试为我的Electron应用程序添加一个全局快捷方式,该快捷方式将切换显示/隐藏它。我的应用程序是一个菜单栏应用程序,使用和React构建 我有以下代码。为了简单起见,我省略了一些内容,但这就是我设置全局快捷方式的方式 我认为重要的是要注意maxogden/menubar自述文件上的提示之一: 使用mb.on('after-create-window',callback)在您的 应用程序已加载 一旦菜单栏第一次被打开,我的快捷方式将被注册,并将用于显示应用程序。但是,我实现的取消注册快捷

我正在尝试为我的Electron应用程序添加一个全局快捷方式,该快捷方式将切换显示/隐藏它。我的应用程序是一个菜单栏应用程序,使用和React构建

我有以下代码。为了简单起见,我省略了一些内容,但这就是我设置全局快捷方式的方式

我认为重要的是要注意
maxogden/menubar
自述文件上的提示之一:

使用mb.on('after-create-window',callback)在您的 应用程序已加载

一旦菜单栏第一次被打开,我的快捷方式将被注册,并将用于显示应用程序。但是,我实现的取消注册快捷方式并重新注册以隐藏应用程序(显示时)的代码似乎不起作用

我不确定是否在正确的事件处理程序中设置了重新注册快捷方式的代码,即显示后的
焦点丢失的
。我觉得我使用的这些事件处理程序与我的
菜单直接相关,而不是
菜单.window
。这可以解释为什么没有重新注册快捷方式,但我不确定

有人知道我如何明智地设置全局快捷切换来打开/关闭我的菜单栏应用程序吗?

从菜单栏文档()菜单栏实例公开了以下方法:

{
  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()
});
从menubar docs()中,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()
});