我试图用Java升级我的应用程序,使其仅在具有特定名称的进程窗口处于活动状态时才能工作。我发现使用JNI可以做到这一点,但是我不知道该怎么做。我只是找不到任何可以解释它的描述或示例。我的问题是- 如何获取Windows中当前活动窗口的进程名称(通过JNI或其他方式-我接受任何其他解决方案)?
减轻您的痛苦,并使用JNA。您将需要下载 Win32 API的 jna.jar 和 jna -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); } }