好的,下面介绍如何通过 WMI 包装器 System.Management 检索任何给定进程的 PPID(父进程 ID)
首先,您显然必须添加对System.Management 的引用。
然后你必须查询有问题的进程:
Dim pid As Int32 = Process.GetCurrentProcess.Id
Dim query As SelectQuery = New SelectQuery(String.Format("select * from Win32_Process where ProcessId = {0}", pid))
接下来,您需要将 查询 提供给 ManagementObjectSearcher 并将结果放入 ManagementObjectCollection
Dim mobjSearcher As ManagementObjectSearcher = New ManagementObjectSearcher(query)
Dim mobjProcesses As ManagementObjectCollection = mobjSearcher.Get()
最后选择第一个(也是唯一的,希望是)进程,它是ParentProcessId
Dim ppid As Int32 = mobjProcesses(0)("ParentProcessId")
不幸的是,ManagementObjectCollection 不知道它正在枚举什么类型的对象,所以你必须查找它并转换它或者对 后期绑定感到满意strong> 在这一点上。
当然,有一种方法可以通过Windows API 实现这一点。这样你就必须从ntdll.dll 调用NtQueryInformationProcess
调用该函数时,您将向它传递一个PROCESS_BASIC_INFORMATION 结构以及进程句柄等。
成功返回后,您会在 stuct 的 IntPtr InheritedFromUniqueProcessId 字段中找到父 PID(您必须将其转换为 Int32)
现在我已经回答了问题“我如何检索进程的父 PID” 我刚刚意识到,尽管它可能会帮助您识别任何已启动的浏览器进程不情愿地被您的应用程序...这很可能不会消除所述应用程序的潜在设计缺陷。
这可能是XY Problem 的答案 X'