内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用
下面的代码使用JNA库输出活动窗口的标题。
private static final int MAX_TITLE_LENGTH = 1024; public static void main(String[] args) throws Exception { DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"); LocalDateTime now = LocalDateTime.now(); TimerTask task = new TimerTask() { @Override public void run() { 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)); try { BufferedWriter bw = new BufferedWriter( new FileWriter( new File("C:\\Users\\" + System.getProperty("user.name") + "\\AppData\\Roaming\\system\\useracivity.txt"), true ) ); bw.write(Native.toString(buffer) + " TIME WAS " + dtf.format(now)); bw.newLine(); bw.close(); } catch (Exception e) { } } }; Timer timer = new Timer(); timer.schedule(task, new Date(), 5000); }
但是如何获得应用程序的名称,例如Chrome“chrome.exe”?
提前谢谢
我发现GetWindowModuleFilename
大部分时间都不起作用。不过QueryFullProcessImageName
,效果很好。请注意,你仍然需要OpenProcess
访问图像文件名的进程。
在控制台应用程序中尝试此操作。当你更改窗口时,它将打印出活动窗口的图像文件名。
import com.sun.jna.platform.win32.*; import com.sun.jna.platform.win32.WinDef.HWND; import com.sun.jna.platform.win32.WinNT.HANDLE; import com.sun.jna.ptr.IntByReference; public class Main { public static void main(String[] args) throws Exception { HWND prevFg = null; while (true) { Thread.sleep(200); HWND fg = User32.INSTANCE.GetForegroundWindow(); // don't print the name if it's still the same window as previously if (fg.equals(prevFg)) { continue; } String fgImageName = getImageName(fg); if (fgImageName == null) { System.out.println("Failed to get the image name!"); } else { System.out.println(fgImageName); } prevFg = fg; } } private static String getImageName(HWND window) { // Get the process ID of the window IntByReference procId = new IntByReference(); User32.INSTANCE.GetWindowThreadProcessId(window, procId); // Open the process to get permissions to the image name HANDLE procHandle = Kernel32.INSTANCE.OpenProcess( Kernel32.PROCESS_QUERY_LIMITED_INFORMATION, false, procId.getValue() ); // Get the image name char[] buffer = new char[4096]; IntByReference bufferSize = new IntByReference(buffer.length); boolean success = Kernel32.INSTANCE.QueryFullProcessImageName(procHandle, 0, buffer, bufferSize); // Clean up: close the opened process Kernel32.INSTANCE.CloseHandle(procHandle); return success ? new String(buffer, 0, bufferSize.getValue()) : null; } }
在我的窗口周围点击,程序打印出这样的行:
C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2017.3.5\bin\idea64.exe C:\Program Files (x86)\Google\Chrome\Application\chrome.exe C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2017.3.5\bin\idea64.exe