2013-03-28 60 views
1

我已經創建了這個方法,應該返回完整的路徑和文件名,以便我可以唯一標識一個程序。但是,它只返回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); 

} 
+0

可能重複[在Windows操作系統中使用JNA從進程線程ID獲取進程名稱](http://stackoverflow.com/questions/15692460/get-process-name-from-process-thread-id-in-windows -os-using-jna) – Java42

+0

'新的指針(1)'和'零指針'是高度可疑的。如果您想傳遞一個整數參數,請在方法簽名中聲明一個整數參數。如果你想傳遞一個NULL參數,傳遞'null'。 – technomage

+0

我誤解了hModule,它是getModuleFileNameEx方法的第二個輸入,我認爲它是一個指針。我已將它更改爲null,但現在它打印出 而不是字符串,它仍然只檢索javaw.exe進程的pid,而不是原始問題中提到的getForegroundWindow Handle'FocusedWindow'。原始帖子中的代碼已更新。 –

回答

1

GetWindowModuleFileName和GetModuleFileName當前進程只工作(即你得到的就只是當前進程的窗口有用的信息)在Windows NT 4.0和更高版本。

http://support.microsoft.com/?id=228469

文章建議使用PSAPI函數GetModuleFileNameEx代替。

編輯

你需要convert the Window handle to a module handle(這可能是比窗口句柄轉換爲PID到模塊句柄短)。請記住,窗口句柄只是一個地址(所以你需要GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS標誌)。

+0

我剛剛嘗試過使用PSAPI,但是我現在遇到OpenProcess問題,它給了我錯誤:'類型不匹配:無法從WinNT.HANDLE轉換爲指針'。我已將創建的新方法和psapi界面添加到原始帖子中。 –