22

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

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

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

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

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

4

3 回答 3

29

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

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;
    }
}
于 2016-07-27T13:31:20.213 回答
6

看看这个 -查找我自己的 .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(您拥有)查找子进程的方法。

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

于 2013-07-31T10:38:16.883 回答
1

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

于 2013-07-29T11:29:53.507 回答