2012-04-08 61 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中

好了,现在有;)

相关问题