memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

jnativehookをお試し

Javaでグローバルフックをしたく。

あれこれ探したら、またまた偉い先人が開発してくれています。ありがたく使わせていただきます。

github.com

以下、手順です。環境はOSX10.11.2です。Java1.7。(JavaなのでOS非依存ですがWinだとswtを用いた別解があるようです。)

で、上記はGithubなので早速クローンしてビルドしようとしたら、結構、環境を整えるだけで面倒。。。バイナリがないかと探したら以下のサイトに。さすがSatckoverflow。サマサマです。

stackoverflow.com

で、以下のページでバイナリがダウンロードできるとのこと。

github.com

JNativeHook-2.0.3.zipをダウンロードして展開します。jarフォルダ内にjnativehook-2.0.3.jarがあります。ありがたい。。。

あとは、EclipseJavaプロジェクトを作成して、そのプロジェクトに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でもいろいろなことができそうですなぁ。。。