2011-04-23 5 views
10

이전 질문 (https://stackoverflow.com/questions/5206633/java-find-out-what-application-window-is-in-focus))에서 비슷한 질문을했지만 JNI를 사용하도록 안내 받았으며 많은 성공을 거두지 못했습니다 ... 일부 자습서를 읽었으며 일부는 잘되고 다른 일부는 그렇지 않습니다. 여전히 필요한 정보를 얻을 수 없습니다. 이것은 전경에있는 윈도우의 제목입니다.JNA를 사용하여 GetForegroundWindow()를 가져 오는 중입니다.

이제 JNA를 살펴 보았지만 GetForegroundWindow()에 액세스하는 방법을 알 수 없습니다. 이 코드를 사용하여 윈도우에 대한 핸들을 일단 내가 (다른 스레드에 있음)의 텍스트를 인쇄 할 수 있습니다 생각?!

import com.sun.jna.*; 
import com.sun.jna.win32.*; 

public class jnatest { 
    public interface User32 extends StdCallLibrary { 
     User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class); 

     int GetWindowTextA(PointerType hWnd, byte[] lpString, int nMaxCount); 
    } 

    public static void main(){ 
     byte[] windowText = new byte[512]; 

     PointerType hwnd = //GetForegroundWindow() (?)... 
     User32.INSTANCE.GetWindowTextA(hwnd, windowText, 512); 
     System.out.println(Native.toString(windowText)); 

    } 
} 

어떤 제안을 감사

답변

10

단순히 인터페이스에 네이티브 GetForegroundWindow 일치하는 메서드 호출, 그래서 뭔가를 추가하는 방법에 대한 방법 : 창 제목을 얻는 것은 당신이 원하는 모든 경우

import com.sun.jna.*; 
import com.sun.jna.platform.win32.WinDef.HWND; 
import com.sun.jna.win32.*; 

public class JnaTest { 
    public interface User32 extends StdCallLibrary { 
     User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class); 
     HWND GetForegroundWindow(); // add this 
     int GetWindowTextA(PointerType hWnd, byte[] lpString, int nMaxCount); 
    } 

    public static void main(String[] args) throws InterruptedException { 
     byte[] windowText = new byte[512]; 

     PointerType hwnd = User32.INSTANCE.GetForegroundWindow(); // then you can call it! 
     User32.INSTANCE.GetWindowTextA(hwnd, windowText, 512); 
     System.out.println(Native.toString(windowText)); 
    } 
} 
+0

빠른 답장을 보내 주셔서 감사합니다! 어떤 이유로 코드를 컴파일 할 수 없으며 com.sun.jna.platform.win32.WinDef.HWND를 가져올 수 없습니다. 및 HWND GetForegroundWindow(); 무효 인 것 같습니다. 자연적으로, 나는 또한 그것을 부르려고 노력하는 데 오류가있다. 내가 뭔가를 놓칠 수 있을까요? –

+0

@ 대니얼 : 천만에요. 작동 했나요? –

+0

@ Hovercraft Eels의 전체 아니요, 저는 우연히 응답을 너무 빨리 제출했습니다. 이제 완전한 대답입니다 : P –

6

, 당신은 명시 적으로 로드 필요가 없습니다 user32 라이브러리 JNA는 platform.jar 파일에 있습니다 (적어도 v3.4에서는 입니다).

import com.sun.jna.Native; 
import com.sun.jna.platform.win32.WinDef.HWND; 
import com.sun.jna.platform.win32.User32; 

public class JnaApp { 

    public static void main(String[] args) { 
     System.out.println("title is " + getActiveWindowTitle()); 
    } 

    private static String getActiveWindowTitle() { 
     HWND fgWindow = User32.INSTANCE.GetForegroundWindow(); 
     int titleLength = User32.INSTANCE.GetWindowTextLength(fgWindow) + 1; 
     char[] title = new char[titleLength]; 
     User32.INSTANCE.GetWindowText(fgWindow, title, titleLength); 
     return Native.toString(title); 
    } 

} 

User32's Javadoc에 대한 자세한 내용보기 :

나는이 여기서 일하는 얻었다. 그것은 user32 라이브러리의 거의 모든 기능을 가지고있다.

관련 문제