2013-07-29 17 views
14

biegnę plik .exe za pomocą tego kodu:monitor procesów potomnych procesu

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

Jeśli zacznę Stopwatch przed rozpoczęciem procesu i zatrzymać go po proc.WaitForExit(); linii, można uzyskać czas, który użytkownik był używając tego konkretnego programu.

Problem, przed którym stoję, polega na tym, że niektóre programy (i gry) używają programów uruchamiających - małego pliku .exe, który zazwyczaj sprawdza coś, a następnie uruchamia inny plik .exe, który jest faktycznie programem/grą, którą użytkownik chce uruchomić . W takich przypadkach powyższy kod nie działa, ponieważ zwraca się po uruchomieniu programu uruchamiającego.

Jak mogę śledzić wszystkie procesy, które proc biegnie i czekać unitl wszystkie z nich są zakończone?

+0

nie moja odpowiedź ci pomogła? –

+0

@NoIdeaForName: Niestety nie :(nie wiem, nazwa procesu za – xx77aBs

+0

+1 dla metody wydłużania – JoanComasFdz

Odpowiedz

5

Spójrz na to - Find all child processes of my own .NET process/find out if a given process is a child of my own? lub http://social.msdn.microsoft.com/Forums/vstudio/en-US/d60f0793-cc92-48fb-b867-dd113dabcd5c/how-to-find-the-child-processes-associated-with-a-pid. Umożliwiają one znalezienie procesów potomnych przez macierzysty PID (który posiadasz).

Możesz napisać monitorować proces tworzenia i ty również dostać swoje dzieci. Możesz wtedy śledzić wszystko i czekać, aż wszystkie się skończą. Mówię "próbuję", ponieważ nie jestem pewien, czy można złapać bardzo szybkie zmiany (proces rozpoczynający się od innych, a następnie umierający, zanim zdobędziesz swoje dzieci).

+0

Dzięki, sprawdziłem linki, które mi dałeś i udało mi się stworzyć dobre rozwiązanie za pomocą PIDów :) – xx77aBs

1

nie można czekać na proces (b) inny proces (A) jest uruchomiony, jeśli ten proces (A) nie jest oczekiwanie na proces (B). możesz śledzić proces za pomocą Process.GetProcessesByName(), jeśli wiesz, że to jest nazwa

+0

Dzięki, ale to mi nie pomoże. nie znam nazwy pliku exe, który ma zostać uruchomiony. Dlatego muszę się jakoś dostać wszystkie procesy proc zostały rozpoczęte. – xx77aBs

+0

w takim przypadku można śledzić aktywne procesy przed i po prowadził program. .. to nie jest dobry sposób, ale jest to tylko jeden można użyć –

+0

myślałam o tym, ale to nie jest bardzo niezawodny. postaram się znaleźć lepsze rozwiązanie, a jeśli mi się to nie uważam, 'll może śledzić tylko te procesy, których plik wykonywalny plik znajduje się w tym samym folderze co program uruchamiający lub coś w tym stylu. – xx77aBs

7

Oto rozwiązanie, które pytający znaleziono:

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; 
    } 
} 
Powiązane problemy