jna如何从Java获取Windows进程描述?
下面是获取windows中当前正在运行的进程列表的代码
import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.Tlhelp32;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.WinNT;
import com.sun.jna.win32.W32APIOptions;
import com.sun.jna.Native;
public class ListProcesses {
public static void main(String[] args) {
Kernel32 kernel32 = (Kernel32) Native.loadLibrary(Kernel32.class, W32APIOptions.UNICODE_OPTIONS);
Tlhelp32.PROCESSENTRY32.ByReference processEntry = new Tlhelp32.PROCESSENTRY32.ByReference();
WinNT.HANDLE snapshot = kernel32.CreateToolhelp32Snapshot(Tlhelp32.TH32CS_SNAPPROCESS, new WinDef.DWORD(0));
try {
while (kernel32.Process32Next(snapshot, processEntry)) {
System.out.println(processEntry.th32ProcessID + "\t" + Native.toString(processEntry.szExeFile)+"\t"+processEntry.readField(""));
}
}
finally {
kernel32.CloseHandle(snapshot);
}
}
}
但我无法在输出中获得流程/服务的描述。请提供解决方案,以获取每个运行过程的过程描述。提前谢谢
# 1 楼答案
(由OP在回复中回复。转换为社区wiki回复。请参见Question with no answers, but issue solved in the comments (or extended in chat))
# 2 楼答案
不必加载和调用内核32,只需在windows中使用以下代码段,即可使用运行时执行本机进程:
然后执行调用Windows Management Information Command-line的命令:
processName应该包含您试图从中获取信息的正在运行的应用程序或exe的名称
然后,返回的列表将包含正在运行的应用程序的状态信息的行输出。第一个条目将包含各个字段的标题信息,而下面的条目将包含所有匹配进程名称的信息
有关WMIC的更多信息:
嗯
# 3 楼答案
当我今天偶然发现this post here展示了如何从可执行文件中提取版本信息时,我想起了你的帖子,于是我开始了一些调查
This further post声明流程描述只能从可执行文件本身提取,因此我们需要着手JNA,而不是解析来自
WMIC
或TASKLIST
的一些输出。这篇文章进一步链接了MSDN page for VerQueryValue函数,它提供了一种提取流程描述的C方式。在这里,第二个参数尤其值得关注,因为它定义了要返回的内容在第一篇文章中提到的代码中,现在需要将C struct typedef转换为Java等价物。我将在这里发布完整的代码,至少在^{上对我有效:
马文·波姆。xml:
LangAndCodePage。java——一个助手类,它将提取的十六进制值映射到翻译表中包含的语言和代码页信息的可读输出。因此,这些值取自this page here:
最后但并非最不重要的是提取Windows资源管理器的文件版本和文件描述的代码。代码中包含了大量的文档,我自己也用它来学习这些东西;)
最后,我在德国Windows 7 64位上收到的输出:
嗯
@Edit:更新了代码,使用结构的类表示来简化值的提取(处理字节确实需要它们按照接收到的字节的顺序进行转换——大端和小端问题)
在一些人尝试使用一个应用程序后发现,该应用程序在其文件中使用多种语言和代码页,我可以在其中测试多个翻译的输出
@Edit2:重构代码并将其放到github。如评论中所述,运行Logitech WingMan事件监视器github repo代码的输出返回多个语言和代码页段: