2012-04-08 67 views
0

我正在使用JNA來使用user32.dll和kernel32.dll。如果我指定title的過程,我有示例代碼可以給我的句柄。我可以通過可執行文件名得到處理過程嗎?

hWnd = User32.FindWindowA(null, "Call of Duty®: Modern Warfare® 3 Multiplayer"); 

我真的不想搜索Title的進程句柄。有沒有任何方法需要exe名字?像這樣:

hWnd = User32.FindWindowByExecutable ("iw5mp.exe"); 

因此,如果該進程沒有運行,它將返回0否則句柄。

另外,當使用JNA時,eclipse顯然不能自動提示User32或Kernel32 dll中存在的方法。那麼,你在這種情況下做了什麼。只是谷歌可能的方法?

+0

可能相關:http://stackoverflow.com/questions/2719756/find-window-with-specific-text-for-a-process – assylias 2012-04-08 11:22:35

+0

@assylias:我不認爲java中沒有像'Process.GetProcesses'這樣的東西。 – 2012-04-08 11:24:03

+0

接受的答案建議枚舉使用user32的進程。這可能是你可以使用的東西。 – assylias 2012-04-08 12:49:14

回答

2

傳遞給FindWindow()作爲第二個參數的字符串不是進程的標題。反而是一些窗口的標題。而FindWindow()返回的值是(驚喜!)句柄的窗口,而不是過程句柄。

如果你想找到的窗口的標題可能會改變,我建議你通過他們的類名稱(FindWindow的第一個參數),讓第二個參數爲null的搜索窗口。

Windows應用程序窗口類可能由Microsoft Spy ++或類似軟件確定。

+0

現在,這是有點有趣;)謝謝順便說一句。 – 2012-04-08 13:19:30

0

使用Java 9,由於JEP 102,將有可能獲得進程的句柄給定的可執行文件名稱,新ProcessHandle接口:

Optional<ProcessHandle> findByExactCommand(String command) { 
    return ProcessHandle.allProcesses().filter(process -> { 
     Optional<String> cmd = process.info().command(); 
     return cmd.isPresent() && cmd.get().equals(command); 
    }).findFirst(); 
} 

在標題字面上回答問題,忽略JNA方面,但閱讀評論似乎是OP是後:

我不認爲有一個像Process.GetProcesses東西在java中

好了,現在有;)

相關問題