†でおきしブログ†

ウナギ食べたいヽ(•̀ω•́ )ゝ✧

ElectronのMenuのAccelerator"PrintScreen"が効かないんだが【Electron version:5.0.10】

☆根深いイシューっぽい

github.com



で、globalShortcutでPrintScreenキー設定したらいけました。
なんだけどアプリがアクティブでなくてもキーアサイン効いちゃって、そういうもんなん?と思いAPI Document読んでみると…

Note: The shortcut is global; it will work even if the app does not have the keyboard focus. You should not use this module until the ready event of the app module is emitted.

globalShortcut | Electron

そういうもんらしい

☆windowのフォーカスの有無でglobalShortcutを制御できる?

globalShortcutはそもそもそういうものらしいのですが、アプリがアクティブでない場合にはショートカットを効かせたくない場合もあると思います。

そういう時はBrowserWindowからフォーカスが離れた時に解除するという方法を思い付きました。

  1. BrowserWindowのblurイベントをキャッチ
  2. globalShortcutの"globalShortcut.unregister(accelerator)"又は"globalShortcut.unregisterAll()"でショートカット登録を破棄
  3. BrowserWindowのfocusイベントで再びglobalShortcutを登録

一見良さげなのですが、Dialog(showmessageboxとか)が表示された時もblurイベントが発生するので、Dialogが表示されるとショートカットが外れてしまいます。※ちなみにDialog表示メソッドの引数にはwindowを指定しています。

なお、Dialog表示中はそもそもMenuのAcceleratorは機能しませんでした。

ぐぬぬ

☆結論

  1. ElectronのMenuのAcceleratorには効かないキーがあるよ
    • "PrintScreen"とか"Alt"とか
    • ちなみにglobalShortcutで"Alt"を登録するとエラー吐きました。なんやねん。"Alt"単体はWindowsではメニュー表示のキーにもなっているので、ダメっぽいのですが、このあたりのエラー制御は現状未完成といったところでしょうか。
  2. windowに紐付けたDialog表示してるとMenuのAccelerator自体効かないよ
    • window無しだとWindowと無関係なModalになるんだけど、Dialogが迷子になるのでよろしくない
  3. 使える範囲でショートカットキー(Accelerator)と付き合っていくしかないね
★蛇足

"electron-localShortcut"っていうnpmパッケージも試したんですが、同様に"PrintScreen"効きませんでした。