☆根深いイシューっぽい
で、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からフォーカスが離れた時に解除するという方法を思い付きました。
- BrowserWindowのblurイベントをキャッチ
- globalShortcutの"globalShortcut.unregister(accelerator)"又は"globalShortcut.unregisterAll()"でショートカット登録を破棄
- BrowserWindowのfocusイベントで再びglobalShortcutを登録
一見良さげなのですが、Dialog(showmessageboxとか)が表示された時もblurイベントが発生するので、Dialogが表示されるとショートカットが外れてしまいます。※ちなみにDialog表示メソッドの引数にはwindowを指定しています。
なお、Dialog表示中はそもそもMenuのAcceleratorは機能しませんでした。
ぐぬぬ。
☆結論
- ElectronのMenuのAcceleratorには効かないキーがあるよ
- "PrintScreen"とか"Alt"とか
- ちなみにglobalShortcutで"Alt"を登録するとエラー吐きました。なんやねん。"Alt"単体はWindowsではメニュー表示のキーにもなっているので、ダメっぽいのですが、このあたりのエラー制御は現状未完成といったところでしょうか。
- windowに紐付けたDialog表示してるとMenuのAccelerator自体効かないよ
- window無しだとWindowと無関係なModalになるんだけど、Dialogが迷子になるのでよろしくない
- 使える範囲でショートカットキー(Accelerator)と付き合っていくしかないね
★蛇足
"electron-localShortcut"っていうnpmパッケージも試したんですが、同様に"PrintScreen"効きませんでした。