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().