2012-01-03 45 views
12

私はJNAの初心者です。私は最小化されたものを含むすべてのウィンドウのハンドルを取得しようとしています。私はすべての窓のうちHWNDが必要です。私はウィンドウのリストを取得するのに役立つWindows: how to get a list of all visible windows?という質問を投げましたが、それはintとしてhWndタイプを持っています。 com.sun.jna.platform.win32.WinDef.HWNDhWndを尋ねる関数com.sun.jna.platform.win32.User32で使用することはできません。したがって、intポインタではなく、com.sun.jna.platform.win32.WinDef.HWNDタイプのすべてのウィンドウハンドルを取得する方法はありますか?最後に、なぜ違いがintHWNDですか?それはどのように両方を受け入れますか?私は少し混乱しています。ありがとう。Java(JNAを使用)ですべてのウィンドウハンドルのリストを取得するには?

私は(Hovercreftの答えから編集)次のコードを持っている:

import com.sun.jna.Native; 
    import com.sun.jna.Pointer; 
    import com.sun.jna.platform.win32.User32; 
    import com.sun.jna.platform.win32.WinDef.HWND; 
    import com.sun.jna.platform.win32.WinDef.RECT; 
    import com.sun.jna.platform.win32.WinUser.WNDENUMPROC; 

    public class TryWithHWND { 

    public static void main(String[] args) { 
     final User32 user32 = User32.INSTANCE; 
     user32.EnumWindows(new WNDENUMPROC() { 
      int count = 0; 
      public boolean callback(HWND hWnd, Pointer arg1) { 
       char[] windowText = new char[512]; 
       user32.GetWindowText(hWnd, windowText, 512); 
       String wText = Native.toString(windowText); 
       RECT rectangle = new RECT(); 
       user32.GetWindowRect(hWnd, rectangle); 
       // get rid of this if block if you want all windows regardless 
       // of whether 
       // or not they have text 
       // second condition is for visible and non minimised windows 
       if (wText.isEmpty() || !(User32.INSTANCE.IsWindowVisible(hWnd) 
         && rectangle.left > -32000)) { 
        return true; 
       } 
       System.out.println("Found window with text " + hWnd 
         + ", total " + ++count + " Text: " + wText); 
       return true; 
      } 
     }, null); 
    } 
} 

私は(ないカスタムインターフェイス)デフォルトUser32クラスを使用しようとしました。それは正常に動作しています。私は疑問を持っています。なぜ、既存のインターフェイスの代わりにユーザー定義のインターフェイスを使用しているのですか?もう一つ、ユーザー定義のメソッドのシグネチャと既存のシグネチャのシグネチャとの間には常に違いがあります。たとえば、変数windowTextchar[]ですが、ホバークラフトの変数はbyte[]です。誰も私を説明することはできますか?ありがとう。

+0

は私の答えにWinDef.HWNDを使用してサンプルコードを追加しました。 –

答えて

12

JNAの最新バージョンでこれを修正する必要があります(JNAの著者の1人、Luke Quinane、州here)。最新のバージョンを使用してJNA APIをチェックすると、WinUser.WNDENUMPROCインターフェイスのメソッドは実際にはlongまたはintではなく、WinDef.HWNDをそのパラメータとして使用することがわかります。例えば

import com.sun.jna.Native; 
import com.sun.jna.Pointer; 
import com.sun.jna.platform.win32.WinDef.HWND; 
import com.sun.jna.platform.win32.WinUser; 
import com.sun.jna.platform.win32.WinUser.WNDENUMPROC; 
import com.sun.jna.win32.StdCallLibrary; 

public class TryWithHWND { 
    public interface User32 extends StdCallLibrary { 
     User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class); 
     boolean EnumWindows(WinUser.WNDENUMPROC lpEnumFunc, Pointer arg); 
     int GetWindowTextA(HWND hWnd, byte[] lpString, int nMaxCount); 
    } 

    public static void main(String[] args) { 
     final User32 user32 = User32.INSTANCE; 
     user32.EnumWindows(new WNDENUMPROC() { 
     int count = 0; 
     @Override 
     public boolean callback(HWND hWnd, Pointer arg1) { 
      byte[] windowText = new byte[512]; 
      user32.GetWindowTextA(hWnd, windowText, 512); 
      String wText = Native.toString(windowText); 

      // get rid of this if block if you want all windows regardless of whether 
      // or not they have text 
      if (wText.isEmpty()) { 
       return true; 
      } 

      System.out.println("Found window with text " + hWnd + ", total " + ++count 
        + " Text: " + wText); 
      return true; 
     } 
     }, null); 
    } 
} 
+0

ありがとう!私は私の質問にあなたのコードを追加しました。もっと理解できるように助けてくれますか?再度、感謝します。 – Ahamed

+0

'HWND'がクリアされます。なぜ、デフォルトのUser32がparamとして 'char []'を持っていますが、あなたが定義したものが 'byte []'を持っていますか? – Ahamed

+4

ユニコードバージョンのメソッド(SomeFunctionW)にアクセスする場合は、LPTCHARパラメータにchar []を使用する必要があります。 ASCIIバージョン(SomeFunctionA)を使用する場合は、byte []を使用する必要があります。 MSヘッダーは、UNICODEが定義されているかどうかに応じて自動的に "SomeFunction"を "SomeFunctionW"または "SomeFunctionA"にマップします。 JNAは、Native.loadLibraryに渡されるオプションに応じて同じ処理を行います。上記の例のように、接尾辞「A」または「W」を明示的に使用することもできます。 – technomage

関連する問題