我正在开发一个MS Windows C#Winform项目,我无法获得PPID(父进程ID)。 我找到了很多解决方案,但似乎没有任何解决方案与操作系统和语言一起使用。
我如何获得PPID?
答案 0 :(得分:1)
如果您可以使用System.Management,这很容易:
private static int GetParentProcess(int Id)
{
int parentPid = 0;
using (ManagementObject mo = new ManagementObject("win32_process.handle='" + Id.ToString() + "'"))
{
mo.Get();
parentPid = Convert.ToInt32(mo["ParentProcessId"]);
}
return parentPid;
}
否则你可能不得不通过CreateToolhelp32Snapshot like this求助于P / Invoke调用
答案 1 :(得分:0)
.NET没有提供内置方式。 Process.GetProcesses()
本身使用NtQuerySystemInformation(SystemProcessInformation,)
来查询大多数流程属性,其返回的条目具有代码无法使用的PPID字段。
所以,要走的路是使用外部技术:
WMI
toolhelp32
API ,例如: holtavolt's answer。它可以对特定或所有流程进行快照。
NtQueryInformationProcess(,ProcessBasicInformation,)
。
上述 NtQuerySystemInformation(SystemProcessInformation,)
其他注意事项:
请记住,您获取信息的任何流程都可以随时结束(例外是关键系统流程,但您可能对它们不感兴趣)
在Windows中重用PID而不重置PPID。要过滤掉可能的假父母",请查看StartTime
。真正的父母将比孩子更早开始,假的 - 后来。