11 votes

Process.Exited ne se déclenche pas toujours

Si j'exécute le code suivant :

Process myProcess = new System.Diagnostics.Process();
myProcess.StartInfo.FileName = "notepad.exe";
myProcess.EnableRaisingEvents = true;
myProcess.Exited += new System.EventHandler(Process_OnExit);
myProcess.Start();

public static void Process_OnExit(object sender, EventArgs e)
{
    // Delete the file on exit
}

L'événement est déclenché lorsque je quitte le bloc-notes. Si j'essaie le même code, mais que je démarre une image à la place :

Process myProcess = new System.Diagnostics.Process();
myProcess.StartInfo.FileName = @"C:\Users\Public\Pictures\Sample Pictures\Desert.jpg";
myProcess.EnableRaisingEvents = true;
myProcess.Exited += new System.EventHandler(Process_OnExit);
myProcess.Start();

public static void Process_OnExit(object sender, EventArgs e)
{
    // Delete the file on exit
}

L'événement n'est jamais déclenché. Est-ce parce que le processus qui charge l'image n'est jamais fermé ?

UPDATE : Le processus de démarrage n'est pas toujours une image. Il peut s'agir de n'importe quoi (pdf, document word, etc.). Peut-être que mon approche n'est pas la bonne. Existe-t-il un autre moyen de supprimer le fichier après que l'utilisateur ait quitté le processus ?

Merci de votre attention.

18voto

s.ukreddy Points 59

Vous devez activer les événements de collecte pour le processus.

process_name.EnableRaisingEvents = true;

7voto

Gyuri Points 956

J'utiliserais un fichier temporaire. Il existe des fonctions pour créer un fichier temporaire...

Votre événement ne se déclenche pas en raison de l'absence du processus lui-même, je suppose. Vous pouvez essayer d'utiliser l'interpréteur de commandes pour "démarrer" le document en question, mais rien ne garantit qu'il y aura un gestionnaire pour tous les types de fichiers.

5voto

Sujith Kumar Points 41

Pour Windows media player, essayez le code suivant

 myProcess.StartInfo.FileName = "wmplayer";
 myProcess.StartInfo.Arguments = "yourfilename";

Pour la visionneuse d'images de Windows, essayez ceci

 myProcess.StartInfo.FileName = @"rundll32.exe";
 myProcess.StartInfo.Arguments = @"C:\Windows\System32\shimgvw.dll,ImageView_Fullscreen " + yourfilepath;

Maintenant, les deux vont donner votre événement de sortie dans Windows 7.

1voto

rerun Points 15285

Vous utilisez la visionneuse d'images par défaut de Windows, car un fichier image n'est pas exécutable. J'ai modifié le code pour utiliser la version par défaut de XP et tout s'est bien passé.

class Program
{
    static void Main(string[] args)
    {
        Process myProcess = new System.Diagnostics.Process(); 
        myProcess.StartInfo.FileName = @"rundll32.exe"; 
        myProcess.EnableRaisingEvents = true;
        myProcess.StartInfo.Arguments = @"C:\winnt\System32\shimgvw.dll,ImageView_Fullscreen c:\leaf.jpg";
        myProcess.Exited += new System.EventHandler(Process_OnExit); 
        myProcess.Start();
        Console.Read();

    }
    public static void Process_OnExit(object sender, EventArgs e)
    {
        Console.WriteLine("called");
        Console.Read();
    } 

}

0voto

Jonas Elfström Points 16453

L'événement se déclenche pour moi avec Microsoft Photo Viewer comme visionneuse. Utilisez-vous une visionneuse qui ne se ferme pas ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X