这是一个古老的问题,但我刚刚做完了同样的事情(对于一个与您正在工作的项目有点相似的项目)。您可以使用System.Management中的ManagementObjects来查找进程的ParentId。如果您正在启动Steam,您将拥有Steam的进程Id,尽管按照您当前启动游戏的方式,您将需要查找Steam的进程Id。
你会发现每个游戏通常会产生2-3个不同的子进程。steam覆盖,webclienthelper,然后是游戏本身(可能还有另一个游戏的启动器)。但是,它们都应该是Steam进程的子进程,并且所有进程都应该显示在找到的进程列表中。
它看起来像这样。
代码语言:javascript运行复制List
Process steam = procs.Find(x => x.ProcessName == "Steam");
int steamId = steam.Id;
foreach (var proc in procs)
{
using (ManagementObject mo = new ManagementObject($"win32_process.handle='{proc.Id}'"))
{
if (mo != null)
{
try
{
mo.Get();
int parentPid = Convert.ToInt32(mo["ParentProcessId"]);
if (parentPid == steamId)
{
Console.WriteLine($"{proc.ProcessName} is running as a child to {mo["ParentProcessId"]}");
}
}
catch (Exception ex)
{
// the process ended between polling all of the procs and requesting the management object
}
}
}
}