Контролировать дочерние процессы процесса

Я запускаю .exe файл, используя этот код:

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

Если я запустил Stopwatch перед запуском процесса и остановил его после строки proc.WaitForExit();, я могу получить время, когда пользователь использовал эту конкретную программу.

Проблема, с которой я сталкиваюсь, заключается в том, что некоторые программы (и игры) используют пусковые установки - некоторый маленький .exe файл, который обычно что-то проверяет, а затем запускает другой .exe файл, который на самом деле является программой/игрой, которую пользователь хочет запустить. В этих случаях код выше не работает, потому что он возвращается после запуска.

Как я могу отслеживать все процессы, выполняемые proc, и ждать unitl, все из них завершены?

Ответы

Ответ 1

Взгляните на это - Найти все дочерние процессы моего собственного процесса .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 (который у вас есть).

Вы можете написать мониторинг процесса, который вы создаете, а также получить его детей. Затем вы можете отследить все и дождаться их завершения. Я говорю "попробуй", потому что я не уверен, что вы могли бы очень быстро меняться (процесс начинается с других, а затем умирает, прежде чем вы получите своих детей).

Ответ 2

Вот решение, которое нашел искатель:

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;
    }
}

Ответ 3

вы не можете дождаться процесса (B), выполняется другой процесс (A), если этот процесс (A) не ждет процесса (B). что вы можете сделать, это отслеживать процесс, используя Process.GetProcessesByName(), если вы знаете его имя