Soy un principiante para JNA. Estoy tratando de obtener identificadores para todas las ventanas, incluidas las minimizadas. Necesito HWND
de todas las ventanas. He ido a través de la pregunta Windows: how to get a list of all visible windows? que me ayudó a obtener la lista de ventanas, pero tiene el tipo hWnd
como int. No puedo usarlo con las funciones com.sun.jna.platform.win32.User32
que piden hWnd
del tipo com.sun.jna.platform.win32.WinDef.HWND
. Entonces, ¿hay alguna forma de obtener todos los identificadores de ventana del tipo com.sun.jna.platform.win32.WinDef.HWND
en lugar del puntero int? Finalmente, ¿por qué la diferencia es int
y HWND
? ¿Cómo acepta ambos? Estoy un poco confundido. Gracias.¿Cómo obtener la lista de todos los identificadores de ventanas en Java (usando JNA)?
Tengo el siguiente código (editado a partir de la respuesta de 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);
}
}
He intentado utilizar solamente (no interfaz personalizada) la clase por defecto User32
. Está funcionando bien. Tengo dudas, ¿por qué estamos usando una interfaz definida por el usuario en lugar de una ya existente? Una cosa más, siempre hay diferencia entre la firma del método definido por el usuario y las ya existentes. Por ejemplo, la variable windowText
es char[]
, mientras que la variable de Hovercraft es del tipo byte[]
. ¿Alguien puede explicarme? Gracias.
Agregado código de ejemplo usando WinDef.HWND a mi respuesta. –