放課後プログラミング

調べたことや考えたことなどを忘れないために書きます。

JavaからWindowsAPIを使う

WindowsAPIを用いたプログラミングならC++などの言語を使うのが常識だと思いますが、jnaパッケージを利用することでJavaからでも簡単にWindowsAPIを叩くことができました。

pom.xml
http://mvnrepository.com/artifact/net.java.dev.jna

<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna</artifactId>
    <version>4.1.0</version>
</dependency>
<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna-platform</artifactId>
    <version>4.1.0</version>
</dependency>

「特定のウィンドウを探してハンドラを取得」し、そのハンドラを用いて「ウィンドウをリサイズ・位置の移動を行う」処理は以下のように書ける。

public interface User32 extends com.sun.jna.platform.win32.User32 {

    User32 INST = (User32) Native.loadLibrary(User32.class);

    Pointer HWND_TOP = Pointer.createConstant(0);
    Pointer HWND_BOTTOM = Pointer.createConstant(1);
    Pointer HWND_TOPMOST = Pointer.createConstant(-1);
    Pointer HWND_NOTOPMOST = Pointer.createConstant(-2);

    WinDef.HWND FindWindowA(String lpClassName, String lpWindowName);

    boolean SetWindowPos(WinDef.HWND hWnd, WinDef.HWND hWndInsertAfter,
                         int X, int Y, int cx, int cy,
                         int uFlags);
}

public class WindowPositioner {

    public boolean moveWindow(String windowClassName, int X, int Y, int width, int height) {
        WinDef.HWND hWnd = User32.INST.FindWindowA(windowClassName, null);
        if (hWnd == null) {
            return false;
        }
        User32.INST.SetWindowPos(hWnd, new WinDef.HWND(User32.HWND_TOPMOST),
                                 100, 100, 500, 500, 0x0040);
        return true;
    }
}

これで渡したwindowクラス名のウィンドウを指定した位置に移動させることができる。
使うdllのインターフェースを作り、その中にwinapiにアクセスするためのインスタンスを作成する。
あとは使いたいapiの抽象メソッドをインターフェースに書いていくだけで、それらのメソッドが使えるようになる。


jnaを用いた実装を行うときは、msdnが最強の味方。
http://msdn.microsoft.com/en-us/library/windows/desktop/ms633499(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms633545(v=vs.85).aspx