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

4

2 回答 2

3

在 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 的东西

好吧,现在有;)

于 2017-07-12T18:42:50.347 回答
2

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

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

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

于 2012-04-08T13:15:20.277 回答