在Java中获取活动窗口信息

我正在尝试使用Java升级我的应用程序,只有在具有特定名称的进程窗口处于活动状态时才能工作。 我发现使用JNI可以做到这一点,但我不知道究竟是怎么做到的。 我找不到任何可以解释它的描述或例子。 我的问题是 – 如何在Windows中获取当前活动窗口的进程名称(通过JNI,或其他任何 – 我接受任何其他解决方案)?

为自己省点痛苦并使用JNA 。 您需要为Win32 API 下载 jna.jarjna -platform.jar 。 pinvoke wiki和MSDN可用于查找正确的系统调用。

无论如何,这里是打印当前活动窗口的标题和过程的代码。

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

此代码适用于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); } }