gpt4 book ai didi

c# - 监控一个进程的子进程

转载 作者:可可西里 更新时间:2023-11-01 03:07:35 27 4
gpt4 key购买 nike

我正在使用这段代码运行 .exe 文件:

Process proc = Process.Start("c:\program.exe");
proc.WaitForExit();

如果我在启动进程之前启动 Stopwatch 并在 proc.WaitForExit(); 行之后停止它,我可以获得用户使用该特定程序的时间。

我面临的问题是某些程序(和游戏)使用启动器 - 一些小的 .exe 文件通常会检查某些内容,然后启动另一个 .exe 文件,该文件实际上是用户想要运行的程序/游戏。在这些情况下,上面的代码不起作用,因为它在启动器存在后返回。

如何跟踪 proc 运行的所有进程,并等待它们全部终止?

最佳答案

这是提问者找到的解决方案:

// using System.Management;
public static class ProcessExtensions
{
public static IEnumerable<Process> GetChildProcesses(this Process process)
{
List<Process> children = new List<Process>();
ManagementObjectSearcher mos = new ManagementObjectSearcher(String.Format("Select * From Win32_Process Where ParentProcessID={0}", process.Id));

foreach (ManagementObject mo in mos.Get())
{
children.Add(Process.GetProcessById(Convert.ToInt32(mo["ProcessID"])));
}

return children;
}
}

[更新]

稍微更现代的代码:

// using System.Management;
public static class ProcessExtensions
{
public static IList<Process> GetChildProcesses(this Process process)
=> new ManagementObjectSearcher(
$"Select * From Win32_Process Where ParentProcessID={process.Id}")
.Get()
.Cast<ManagementObject>()
.Select(mo =>
Process.GetProcessById(Convert.ToInt32(mo["ProcessID"])))
.ToList();
}

关于c# - 监控一个进程的子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17922725/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com