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().
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? –
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. –
@Martin. Oui, c'est ce que je voulais dire. Mise à jour pour clarification. – BlueVoodoo