我已經創建了這個方法,應該返回完整的路徑和文件名,以便我可以唯一標識一個程序。但是,它只返回C:\Program Files (x86)\Java\jre6\bin\javaw.exe
或空字符串,而不是特定焦點中的特定程序的路徑。我做錯了什麼?GetModuleFileName窗口焦點JNA Windows操作系統
private void getFocusWindow() {
HWND focusedWindow = User32.INSTANCE.GetForegroundWindow();
char[] nameName = new char[512];
User32.INSTANCE.GetWindowModuleFileName(focusedWindow, nameName, 512);
System.out.println(nameName);
}
使用PSAPI:
解決方案:
提供完整路徑和模塊文件名,唯一的例外是在日食時,它打印出'。有關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操作系統中使用JNA從進程線程ID獲取進程名稱](http://stackoverflow.com/questions/15692460/get-process-name-from-process-thread-id-in-windows -os-using-jna) – Java42
'新的指針(1)'和'零指針'是高度可疑的。如果您想傳遞一個整數參數,請在方法簽名中聲明一個整數參數。如果你想傳遞一個NULL參數,傳遞'null'。 – technomage
我誤解了hModule,它是getModuleFileNameEx方法的第二個輸入,我認爲它是一個指針。我已將它更改爲null,但現在它打印出 而不是字符串,它仍然只檢索javaw.exe進程的pid,而不是原始問題中提到的getForegroundWindow Handle'FocusedWindow'。原始帖子中的代碼已更新。 –