监视进程的子进程

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

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

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

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

如何跟踪proc运行的所有进程,并等待unitl所有进程终止?

看看这个 – 查找我自己的.NET进程的所有子进程/找出给定的进程是否属于我自己的子进程? 或http://social.msdn.microsoft.com/Forums/vstudio/en-US/d60f0793-cc92-48fb-b867-dd113dabcd5c/how-to-find-the-child-processes-associated-with-a-pid 。 它们提供了通过父PID(您拥有)查找子进程的方法。

您可以编写监视您创建的进程并获取其子进程。 然后,您可以跟踪所有内容,并等待所有内容完成。 我说“尝试”,因为我不确定你是否可以捕捉到非常迅速的变化(一个过程开始他人然后在你的孩子出生之前死亡)。

以下是提问者发现的解决方案:

 public static class ProcessExtensions { public static IEnumerable GetChildProcesses(this Process process) { List children = new List(); 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; } } 

你不能等待进程(B)另一个进程(A)正在运行,如果进程(A)没有等待进程(B)。 你可以做的是使用Process.GetProcessesByName()跟踪进程,如果你知道它的名字