如何阻止Electron“占用”全局键盘快捷键?

时间:2019-07-26 07:13:10

标签: javascript electron

我正在构建一个小型音乐播放器。与其他播放器一样,即使应用程序没有焦点,您也可以使用键盘的媒体键(上一首,下一首,播放,暂停)进行控制。


但是,当我注册这些快捷方式以便Electron可以收听它们时,其他应用程序将无法使用它们。如果我的应用程序正在运行,则e。 G。当按下任何一个按键时,Spotify或Window的Groove都不会执行任何操作,因为我的应用程序已经在使用这些按键。

我正在注册这样的快捷方式:

app.on('ready', () => {
    globalShortcut.register('MediaPlayPause', () => {
      window.webContents.send('shortcut', 'MediaPlayPause');
    });

    globalShortcut.register('MediaNextTrack', () => {
      window.webContents.send('shortcut', 'MediaNextTrack');
    });

    globalShortcut.register('MediaPreviousTrack', () => {
      window.webContents.send('shortcut', 'MediaPreviousTrack');
    });
  }
});

所以我的问题是:是否有可能在其他应用程序请求它们时释放这些快捷方式?

如果是,当另一个应用不再需要这些快捷方式时,是否可以重新注册这些快捷方式? (假设其他应用不再需要时将注销快捷方式)

1 个答案:

答案 0 :(得分:0)

恐怕如果不使用任何特定于操作系统的本机资料,就不可能从Electron做到这一点。从理论上讲,您可以在各个功能上应用系统范围的钩子,以注册快捷方式并解决该问题。另一个选择是使用低级键盘钩子,因为这样您根本不必注册“官方”侦听器。

除此之外,我不知道这怎么可能。引用globalShortcut文档:

  

此行为是操作系统所想要的,因为它们不希望应用程序为全局快捷方式而战。

这将是基于Windows的系统的解决方案:https://docs.microsoft.com/en-us/previous-versions/windows/desktop/legacy/ms644985(v%3Dvs.85)使用带有WH_KEYBOARD_LL标志的SetWindowsHookEx。

总而言之,最好的选择是找到一种根本不使用globalShortcut API而是以操作系统特定的方式实现自己的侦听器的方法(大概是低级键盘钩子)。