Контролировать дочерние процессы процесса
Я запускаю .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()
, если вы знаете его имя