我可以通过可执行名称处理进程吗?

时间:2012-04-08 11:16:53

标签: java jna user32 kernel32

我正在使用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中存在的方法。那么,在这种情况下你会怎么做只是google可能的方法?

2 个答案:

答案 0 :(得分:2)

作为第二个参数传递给FindWindow()的字符串不是进程的标题。这是一些窗口的标题。而FindWindow()返回的值是(惊讶!)窗口的句柄,而不是进程句柄。

如果您要查找的窗口标题可能会更改,我建议您按类名(FindWindow的第一个参数)搜索窗口,将第二个参数保留为null。

Windows应用程序窗口类可以由Microsoft Spy ++或类似软件确定。

答案 1 :(得分:2)

借助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之后:

  

我认为java

中没有类似Process.GetProcesses的东西

好吧,现在有了;)