web-dev-qa-db-fra.com

Surveiller les processus enfants d'un processus

J'exécute le fichier .exe en utilisant ce code:

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

Si je lance Stopwatch avant de lancer le processus et que je l'arrête après la ligne proc.WaitForExit();, je peux connaître l'heure à laquelle cet utilisateur utilisait ce programme particulier.

Le problème auquel je suis confronté est que certains programmes (et jeux) utilisent des lanceurs - un petit fichier .exe qui vérifie généralement quelque chose, puis lance un autre fichier .exe qui est en fait le programme/jeu que l'utilisateur souhaite exécuter. Dans ces cas, le code ci-dessus ne fonctionne pas car il est renvoyé après la présence du programme de lancement.

Comment puis-je suivre tous les processus que proc exécute et attendre qu'ils soient tous terminés?

15
xx77aBs

Jetez un coup d'oeil à ceci - Trouvez tous les processus enfants de mon propre processus .NET/découvrez si un processus donné est un enfant à moi? ou http://social.msdn.Microsoft.com/Forums/vstudio/en-US/d60f0793-cc92-48fb-b867-ddc3cd5c/how-to-find-the-child-processes-associated-with -a-pid . Ils fournissent des moyens de trouver des processus enfants par un PID parent (que vous avez).

Vous pouvez écrire surveiller le processus que vous créez et également obtenir ses enfants. Vous pouvez ensuite tout suivre et attendre que tout soit terminé. Je dis "essayer" parce que je ne suis pas sûr que vous puissiez intercepter des changements très rapides (un processus démarrant les autres et mourant avant d'avoir ses enfants). 

5
Vadim

Voici la solution trouvée par le demandeur:

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

vous ne pouvez pas attendre pour le processus (B), un autre processus (A) est en cours d'exécution, si ce processus (A) n'attend pas le processus (B). ce que vous pouvez faire est de suivre le processus en utilisant Process.GetProcessesByName() si vous connaissez son nom

1
No Idea For Name