我已经创build了这个方法,应该返回完整的path和文件名,以便我可以唯一标识一个程序。 但是,它只返回C:\Program Files (x86)\Java\jre6\bin\javaw.exe
或空string,而不是特定程序的焦点path。 我做错了什么?
private void getFocusWindow() { HWND focusedWindow = User32.INSTANCE.GetForegroundWindow(); char[] nameName = new char[512]; User32.INSTANCE.GetWindowModuleFileName(focusedWindow, nameName, 512); System.out.println(nameName); }
使用psapi:
解:
提供完整的path和模块文件名,只有在eclipse打印出“ ”时才有例外。 有关GetModuleFileNameEx方法的更多详细信息,请参阅@ technomage的答案。
private void getFocusWindow() { PsApi psapi = (PsApi) Native.loadLibrary("psapi", PsApi.class); HWND focusedWindow = User32.INSTANCE.GetForegroundWindow(); byte[] name = new byte[1024]; IntByReference pid = new IntByReference(); User32.INSTANCE.GetWindowThreadProcessId(focusedWindow, pid); HANDLE process = Kernel32.INSTANCE.OpenProcess(0x0400 | 0x0010, false, pid.getValue()); psapi.GetModuleFileNameExA(process, null, name, 1024); String nameString= Native.toString(name); System.out.println(nameString); }
psapi课堂:
public interface PsApi extends StdCallLibrary { int GetModuleFileNameExA(HANDLE process, HANDLE module , byte[] name, int i); }
在Windows NT 4及更高版本中,GetWindowmoduleeFileName和GetmoduleeFileName只能与当前进程一起工作(即只能得到当前进程窗口的有用信息)。
http://support.microsoft.com/?id=228469
本文建议使用PSAPI函数GetmoduleeFileNameEx来代替。
编辑
您需要将窗口句柄转换为模块句柄 (这可能比将窗口句柄转换为PID到模块句柄更短)。 请记住,窗口句柄只是一个地址(所以你需要GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS
标志)。