我正在使用以下代码运行.exe文件:
Process proc = Process.Start("c:\program.exe");
proc.WaitForExit();
如果我在开始流程之前启动Stopwatch
并在proc.WaitForExit();
行之后停止,我可以获得用户使用该特定程序的时间。
我面临的问题是某些程序(和游戏)使用启动程序 - 一些小的.exe文件通常会检查某些内容,然后启动另一个.exe文件,该文件实际上是用户想要运行的程序/游戏。在这些情况下,上面的代码不起作用,因为它在启动器存在后返回。
如何跟踪proc
运行的所有进程,并等待所有进程终止?
答案 0 :(得分:18)
以下是提问者发现的解决方案:
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;
}
}
答案 1 :(得分:5)
看看这个 - Find all child processes of my own .NET process / find out if a given process is a child of my own?或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(您拥有)查找子进程的方法。
您可以编写监控您创建的流程并获取其子项。然后,您可以跟踪所有内容,并等待所有内容完成。我说“尝试”,因为我不确定你是否可以捕捉到非常快速的变化(一个过程开始他人,然后在你的孩子出现之前死亡)。
答案 2 :(得分:1)
您不能等待进程(B)另一个进程(A)正在运行,如果该进程(A)没有等待进程(B)。您可以做的是使用Process.GetProcessesByName()
跟踪流程,如果您知道它的名称