Estoy tratando de actualizar mi aplicación en Java para que funcione solo si una ventana del proceso con cierto nombre está activa. Descubrí que esto es posible mediante el uso de JNI, pero no tengo idea de cómo hacerlo exactamente. Simplemente no pude encontrar ninguna descripción o ejemplo que pudiera explicarlo. Mi pregunta es: ¿cómo obtener el nombre del proceso de la ventana actualmente activa en Windows (a través de JNI, o cualquier otra cosa, acepto cualquier otra solución)?Obteniendo información de la ventana activa en Java
28
A
Respuesta
51
Ahórrese algo de dolor y use JNA. Necesitará downloadjna.jar y jna-platform.jar para la API de Win32. La wiki pinvoke y MSDN son útiles para encontrar las llamadas al sistema correctas.
De todos modos, aquí está el código para imprimir el título y el proceso de la ventana actualmente activa.
import static enumeration.EnumerateWindows.Kernel32.*;
import static enumeration.EnumerateWindows.Psapi.*;
import static enumeration.EnumerateWindows.User32DLL.*;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.ptr.PointerByReference;
public class EnumerateWindows {
private static final int MAX_TITLE_LENGTH = 1024;
public static void main(String[] args) throws Exception {
char[] buffer = new char[MAX_TITLE_LENGTH * 2];
GetWindowTextW(GetForegroundWindow(), buffer, MAX_TITLE_LENGTH);
System.out.println("Active window title: " + Native.toString(buffer));
PointerByReference pointer = new PointerByReference();
GetWindowThreadProcessId(GetForegroundWindow(), pointer);
Pointer process = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, pointer.getValue());
GetModuleBaseNameW(process, null, buffer, MAX_TITLE_LENGTH);
System.out.println("Active window process: " + Native.toString(buffer));
}
static class Psapi {
static { Native.register("psapi"); }
public static native int GetModuleBaseNameW(Pointer hProcess, Pointer hmodule, char[] lpBaseName, int size);
}
static class Kernel32 {
static { Native.register("kernel32"); }
public static int PROCESS_QUERY_INFORMATION = 0x0400;
public static int PROCESS_VM_READ = 0x0010;
public static native int GetLastError();
public static native Pointer OpenProcess(int dwDesiredAccess, boolean bInheritHandle, Pointer pointer);
}
static class User32DLL {
static { Native.register("user32"); }
public static native int GetWindowThreadProcessId(HWND hWnd, PointerByReference pref);
public static native HWND GetForegroundWindow();
public static native int GetWindowTextW(HWND hWnd, char[] lpString, int nMaxCount);
}
}
5
Este código funciona con JNA 4,0
import com.sun.jna.Native;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinDef.RECT;
// see http://java-native-access.github.io/jna/4.0/javadoc/
public class EnumerateWindows {
private static final int MAX_TITLE_LENGTH = 1024;
public static void main(String[] args) throws Exception {
char[] buffer = new char[MAX_TITLE_LENGTH * 2];
HWND hwnd = User32.INSTANCE.GetForegroundWindow();
User32.INSTANCE.GetWindowText(hwnd, buffer, MAX_TITLE_LENGTH);
System.out.println("Active window title: " + Native.toString(buffer));
RECT rect = new RECT();
User32.INSTANCE.GetWindowRect(hwnd, rect);
System.out.println("rect = " + rect);
}
}
+0
solo para ventanas – Martin
Cuestiones relacionadas
- 1. Obteniendo el nombre de la ventana activa
- 2. C# obtener información sobre la ventana activa actual
- 3. Obtiene el título actual de la ventana activa en Java
- 4. Establecer la ventana activa
- 5. Obtener la última ventana activa: Obtener Ventana previamente activa
- 6. Obteniendo sesión activa cuenta con JMX (Java Management Extensions) API
- 7. Consulte la ventana activa en WPF?
- 8. Foreground Vs Ventana activa
- 9. Obtener texto resaltado de la ventana activa
- 10. ¿Cómo determinar si la ventana actual es la ventana activa?
- 11. Obteniendo más información de Rprof()
- 12. CreateProcessAsUser Ventana de creación en la sesión activa
- 13. Fondo personalizado para la ventana activa
- 14. Java Maven MOJO - obteniendo información del proyecto POM
- 15. Identificar de forma exclusiva la ventana activa en OS X
- 16. Obteniendo la información de commits aplastados en Git
- 17. Capturar cambio en la ventana activa (para Linux)
- 18. Java - ventana de la imagen
- 19. Obteniendo información de FFProbe con Python
- 20. Obteniendo el control de la ventana en C#
- 21. Cómo recuperar el texto seleccionado de la ventana activa
- 22. Obteniendo convenciones de llamadas desde la información de DWARF
- 23. ¿Cómo obtener el título de la ventana activa con AutoHotKey?
- 24. Obteniendo typeof en Java
- 25. Información extendida de la impresora en Java
- 26. ¿Cómo activar la ventana en Java?
- 27. Obteniendo la jerarquía Clase en Java?
- 28. Reemplazando un método setter, y obteniendo información
- 29. obteniendo nietos de xml en java
- 30. java retener información en la función recursiva
JNA ([Java Native Acceso] (http://jna.java.net/)) es más fácil de usar que JNI, pero para cualquiera de ellos, JNI o JNA, tienes que estudiar cómo usarlos a través de sus tutoriales y referencias y luego debes mirar a través de la API de la ventana para la llamada de función adecuada. No hay atajos aquí. –