2011-06-17 8 views
28

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

+0

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í. –

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

bien demostrado - 1+ :) –

+0

¡Funciona muy bien! Muchas gracias :) – James

+0

llegó aquí de otra pregunta, buena muestra, ahorra mucho tiempo. +1 – BigMike

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