2016年7月8日金曜日

JavaFX で Windows のホットキー登録を行う / JIntellitype の利用

JavaFX で Windows のホットキー登録(Win32API の RegisterHotKey で登録できるもの)を行おうとした場合の方法についてです。

システムトレイの時とは違い、awt 等の既存の UI ライブラリにも無いため、
JNI に頼らなければいけないところですが、
既に Java にラッピングしたライブラリが開発・配布されていて、それが JIntellitype です。
そのため JIntellitype に頼るのが早道かと思われます。

実装コードは次のような感じです。

登録処理(ex. Windowsキー + C で画面を表示させたい場合)
    // register global Windows Hot Key
    JIntellitype.getInstance().registerHotKey(1, JIntellitype.MOD_WIN, (int)'C');
    JIntellitype.getInstance().addHotKeyListener(new HotkeyListener(){
        @Override
        public void onHotKey(int aIdentifier) {
            if(aIdentifier == 1){
                Platform.runLater(() -> {
                    primaryStage.show();
                    primaryStage.toFront();
                });
            }
        }
    });

解除処理
    JIntellitype.getInstance().unregisterHotKey(1);

終了処理
    JIntellitype.getInstance().cleanUp();
キーの登録は registerHotKey() → addHotKeyListener() で Listener 登録となります。
複数のキー登録にも対応していて、register 時の第一引数が識別子となっていて、Listener 側へも引数として渡ります。
また、JavaFX の GUI への処理は、これまたシステムトレイの時と同じく、直接呼び出すのではなく、 Platform.runLater() を使って JAT に対する処理依頼の形を取ります(ここも JAT とスレッドコンテキストが違うため)。

解除処理は登録時の識別子を渡して unregisterHotKey() です。

アプリケーション終了前には cleanUp() を呼び出して後始末処理をするようにして下さい。
システムトレイの時と同じく、Application#stop() に実装をして、 Platform.exit() の呼び出し時に必ず呼び出されるようにすると良いのではないかと思います。

実装は簡単なのですが、実際に Eclipse でライブラリを使う際に注意点があります。

JIntellitype の jar に対して Libraries として Build Path を通すのは当然ですが、
jar → JIntellitype.dll へのパス登録も必要になります。
次のどちらかの方法を使って DLL への関連付けを行います。
  • Project のプロパティ → Java Build Path → Libraries タブ → JIntellitype の jar を開いて "Native library location" を選択 → Edit
  • jar のプロパティ → Native Library 

※ 参考にしたページ

※ 備考
アプリケーションの jar を作る+配布したいという場合には、JIntellitype の DLL を一緒に配布・同じディレクトリに置くことになります。

これを Eclipse のビルドは勝手にはやってくれないので(私の方法が正しくないだけ?)、
手作業でコピーをするか、
Ant などで jar 作成先への DLL の copy 処理を書きたすかなどしないといけないようです。

0 件のコメント:

コメントを投稿