我正在使用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可能的方法?
答案 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的东西
好吧,现在有了;)