Javaでグローバルフックをしたく。
あれこれ探したら、またまた偉い先人が開発してくれています。ありがたく使わせていただきます。
以下、手順です。環境はOSX10.11.2です。Java1.7。(JavaなのでOS非依存ですがWinだとswtを用いた別解があるようです。)
で、上記はGithubなので早速クローンしてビルドしようとしたら、結構、環境を整えるだけで面倒。。。バイナリがないかと探したら以下のサイトに。さすがSatckoverflow。サマサマです。
で、以下のページでバイナリがダウンロードできるとのこと。
JNativeHook-2.0.3.zipをダウンロードして展開します。jarフォルダ内にjnativehook-2.0.3.jarがあります。ありがたい。。。
あとは、EclipseでJavaプロジェクトを作成して、そのプロジェクトにjnativehook-2.0.3.jarを追加します。そして、JNativeHook-2.0.3.zipを展開した JNativeHook/wiki/example にサンプルプログラムがあります。mdですが。。。適当なビュワーでみるとコードが見れます。なんか微妙にコードが古いみたいです。VK_ESCAPEではなくVC_ESCAPEらしく。GlobalScreen.unregisterNativeHook()の例外処理をしなければならないとかで。オリジナルのサンプルにははいっていないので追加したのが以下です。
import org.jnativehook.GlobalScreen; import org.jnativehook.NativeHookException; import org.jnativehook.keyboard.NativeKeyEvent; import org.jnativehook.keyboard.NativeKeyListener; public class GlobalKeyListenerExample implements NativeKeyListener { public void nativeKeyPressed(NativeKeyEvent e) { System.out.println("Key Pressed: " + NativeKeyEvent.getKeyText(e.getKeyCode())); if (e.getKeyCode() == NativeKeyEvent.VC_ESCAPE) { try { GlobalScreen.unregisterNativeHook(); } catch (NativeHookException e1) { e1.printStackTrace(); } } } public void nativeKeyReleased(NativeKeyEvent e) { System.out.println("Key Released: " + NativeKeyEvent.getKeyText(e.getKeyCode())); } public void nativeKeyTyped(NativeKeyEvent e) { System.out.println("Key Typed: " + e.getKeyText(e.getKeyCode())); } public static void main(String[] args) { try { GlobalScreen.registerNativeHook(); } catch (NativeHookException ex) { System.err.println("There was a problem registering the native hook."); System.err.println(ex.getMessage()); System.exit(1); } GlobalScreen.addNativeKeyListener(new GlobalKeyListenerExample()); } }
これができるとJavaでもいろいろなことができそうですなぁ。。。