2011-01-10 3 views
55

Je cherche un moyen de déclencher un morceau de code lorsqu'une application console est fermée manuellement (les utilisateurs ferment la fenêtre). Été essayer avec:"En sortie" pour une application console

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

mais ce qui précède ne fonctionne pas si fermé manuellement.

Existe-t-il des moyens d'utiliser un appel .Net pour cela ou ai-je besoin d'importer la DLL du noyau et de le faire de cette façon?

+2

Par "fermeture manuelle", est-ce que l'utilisateur clique sur la croix "fermer la fenêtre" dans le coin supérieur droit de la fenêtre de la console? –

+0

Je soupçonne ce que vous recherchez est le "Sur la sortie" de la ligne de commande elle-même .. dès que la méthode 'Main' de l'application console est terminée, il est hors de votre contrôle et l'utilisateur doit appuyer sur Entrée pour fermer la fenêtre de ligne de commande. –

+0

@Martin. Oui, c'est ce que je voulais dire. Mise à jour pour clarification. – BlueVoodoo

Répondre

92

Ce code fonctionne pour attraper l'utilisateur de fermer 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); 

} 

méfiez-vous des restrictions. Vous avez pour répondre rapidement à cette notification, vous avez 5 secondes pour terminer la tâche. Prenez plus de temps et Windows va tuer votre code sans cérémonie. Et votre méthode est appelée de manière asynchrone sur un thread de travail, l'état du programme est entièrement imprévisible, donc le verrouillage est susceptible d'être nécessaire. Assurez-vous absolument qu'un avortement ne peut pas causer de problèmes. Par exemple, lors de l'enregistrement de l'état dans un fichier, assurez-vous d'abord d'enregistrer dans un fichier temporaire et d'utiliser File.Replace().

+0

C'est très bon à savoir. Peut-être devoir contourner cela. Merci pour votre réponse. Augmenter votre réponse +1. – BlueVoodoo

+3

Fonctionne très bien! Si quelqu'un est intéressé par les autres types d'événements possibles: http://msdn.microsoft.com/en-us/library/ms683242%28v=vs.85%29.aspx –

+0

enregistrer dans un fichier temporaire d'abord est un très bon conseil. ce n'est pas seulement sûr contre l'application qui se ferme soudainement, mais aussi le système. c'est si simple. juste ce que je cherchais +1 – symbiont

Questions connexes