2011-04-23 15 views
10

Hice una pregunta similar en un hilo anterior (https://stackoverflow.com/questions/5206633/java-find-out-what-application-window-is-in-focus) pero me guiaron a usar JNI, y no estoy teniendo mucho éxito con eso ... He leído algunos tutoriales y mientras algunos funcionan bien, otros no Todavía no puedo obtener la información que necesito, que es el título de la ventana en el primer plano.Usando JNA para obtener GetForegroundWindow();

Ahora estoy buscando en JNA pero no puedo entender cómo acceder a GetForegroundWindow() ... I creo que pueda imprimir el texto una vez que consiga el identificador de la ventana usando el código (que se encuentra en otro hilo):?!

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

    } 
} 

Cualquier sugerencia Gracias

Respuesta

10

¿Qué hay de la simple adición de una llamada a un método para que coincida con el GetForegroundWindow nativas de su interfaz, algo así:

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

¡Gracias por la respuesta rápida! No puedo compilar ese código, por alguna razón, no puedo importar com.sun.jna.platform.win32.WinDef.HWND; y HWND GetForegroundWindow(); parece ser inválido Naturalmente, me da un error al tratar de llamarlo también. ¿Me podría estar perdiendo algo? –

+0

@Daniel: de nada. ¿Funcionó? –

+0

@Hovercraft Full Of Eels No, envié la respuesta demasiado rápido por accidente. Ahora es la respuesta completa: P –

6

Si conseguir el título de la ventana es todo lo que quiere hacer, que no tienen que explícitamente carga la biblioteca user32. JNA viene con él, en el archivo platform.jar (en menos en v3.4).

Tengo esta trabajando aquí:

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

} 

Ver más en User32's Javadoc. Tiene casi todas las funciones en la biblioteca user32.

Cuestiones relacionadas