Usando o JNA para obter GetForegroundWindow ();

Eu fiz uma pergunta semelhante em um tópico anterior ( https://stackoverflow.com/questions/5206633/java-find-out-what-application-window-is-in-focus), mas fui orientado a usar o JNI, e eu Não estou tendo muito sucesso com isso … Eu li alguns tutoriais e enquanto alguns funcionam bem, outros ainda não consegui obter as informações de que preciso, que é o título da janela em primeiro plano.

Agora eu estou olhando para JNA mas não consigo descobrir como acessar GetForegroundWindow () … Eu acho que posso imprimir o texto uma vez que eu pegue o identificador para a janela usando este código (encontrado em outro segmento):

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)); } } 

Alguma sugestão? Obrigado!

Que tal simplesmente adicionar uma chamada de método para combinar o GetForegroundWindow nativo com a sua interface, algo assim:

 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)); } } 

Se obter o título da janela é tudo o que você deseja fazer, não é necessário carregar explicitamente a biblioteca user32 . JNA vem com ele, no arquivo platform.jar (pelo menos na v3.4).

Eu tenho esse trabalho aqui:

 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); } } 

Veja mais no Javadoc do User32 . Tem quase todas as funções na biblioteca user32.