窗口焦点JNA Windows操作系统的GetModuleFileName

我已经创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标志)。