67 votes

"On Exit" pour une application console

Je cherche un moyen de déclencher un morceau de code lorsqu'une application console est fermée manuellement (l'utilisateur ferme la fenêtre). J'ai essayé avec :

AppDomain.CurrentDomain.ProcessExit +=
    new EventHandler(CurrentDomain_ProcessExit);

mais ce qui précède ne fonctionne pas si on le ferme manuellement.

Existe-t-il un moyen d'utiliser un appel .Net pour cela ou dois-je importer la dll du noyau et le faire de cette manière ?

108voto

Hans Passant Points 475940

Ce code fonctionne pour attraper l'utilisateur qui ferme la fenêtre de la console :

using System;
using System.Runtime.InteropServices;

class Program {
    static void Main(string[] args) {
        handler = new ConsoleEventDelegate(ConsoleEventCallback);
        SetConsoleCtrlHandler(handler, true);
        Console.ReadLine();
    }

    static bool ConsoleEventCallback(int eventType) {
        if (eventType == 2) {
            Console.WriteLine("Console window closing, death imminent");
        }
        return false;
    }
    static ConsoleEventDelegate handler;   // Keeps it from getting garbage collected
    // Pinvoke
    private delegate bool ConsoleEventDelegate(int eventType);
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool SetConsoleCtrlHandler(ConsoleEventDelegate callback, bool add);

}

Attention aux restrictions. Vous tienen pour répondre rapidement à cette notification, vous avez 5 secondes pour accomplir cette tâche. Prenez plus de temps et Windows tuera votre code sans ménagement. Et comme votre méthode est appelée de manière asynchrone sur un thread de travail, l'état du programme est totalement imprévisible et le verrouillage sera probablement nécessaire. Assurez-vous absolument qu'un abandon ne peut pas causer de problèmes. Par exemple, lorsque vous enregistrez un état dans un fichier, assurez-vous d'abord d'enregistrer dans un fichier temporaire et d'utiliser File.Replace().

28voto

Madhur Ahuja Points 11471

Vous devez vous connecter à l'événement de sortie de la console et non à votre processus.

http://geekswithblogs.net/mrnat/archive/2004/09/23/11594.aspx

Capture de la sortie de la console C#

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