なずブログ

インフラSE、Java開発、リモートワークエンジニアな人のメモ帳

Javaでキーボードの入力を検知する

f:id:nazuna_0124:20170403224602p:plain

う~む なんとか望みの処理は出来ましたが、

JavaWindowsをどうにかするのが苦手っぽいです。

本格的に作るならC系言語を覚えたほうが早いのかもしれません。

具体的にはC#なんでしょうか。


とりあえず、準備が必要なので1こずつ。

ライブラリのダウンロード

jna.jaとjna-platform.jarが必要です。

github.com


ここからダウンロードして解凍した中に入ってます。


ライブラリに追加

Netbeansでの方法です。もっとやりやすい方法があるのかも?

プロジェクト右クリック>ライブラリ>JAR/フォルダの追加


ソースコード

なんで動いてるのかびっくりするくらいわかってません!

User32とかkaernel32とかおなじみのくくりを呼び出して、

メソッドの引数、戻り値の型を合わせておけばいいっぽいです。


import com.sun.jna.Native;
import com.sun.jna.win32.StdCallLibrary;

public class Windows 
{
    public static interface User32 extends StdCallLibrary
    {
         final User32 instance = (User32) Native.loadLibrary ("user32", User32.class);

         short  GetAsyncKeyState(int key);  

    }

    public static void main(String[] args)
    {
 
        while(User32.instance.GetAsyncKeyState(101) == 0){

        }
        
        System.out.println("テンキーの5が押されました");
    }
}


よくわからんのだけど、インターフェースのくせにインスタンスをもってて、

Newしなくていいようになってる???

素直に継承してメソッドにしておけばいいのかな……


なにはともあれ、これを実行しておいてテンキーの5押すと

無限ループが止まってprintが表示されます。


User32.instance.GetAsyncKeyState(101) これの101は

Keycodeとはまた別です。いろんなとこで紹介されてます。


<Excel, VBA> キー操作をシュミレート - ねこゆきのメモ


参考にさせていただきました!


引数かえればいろんなキーで応用可能です。

ただし、なんらかのキーが押されたのを感知してそれが何か調べる

のは出来ません。 GetKeyboardStateでいけそうなんですが、難しくて挫折。


配列を与えて格納してもらうので、こっちで配列ループにしても

結局変わらないんじゃとおもったり。


Windows API使うたぐいはこれでなんとか応用可能っぽいです。

キーイベントを発生させるのはRobotクラスなるものがあるらしいので

そっちのがよさげです。