Este código funciona para atrapar al usuario cerrar la ventana de la consola:
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);
}
Cuidado con las restricciones. Usted tiene para responder rápidamente a esta notificación, tiene 5 segundos para completar la tarea. Tómate más tiempo y Windows matará tu código sin ceremonias. Y su método se llama asíncronamente en un hilo de trabajo, el estado del programa es completamente impredecible, por lo que es probable que sea necesario bloquearlo. Asegúrese de que un aborto no cause problemas. Por ejemplo, al guardar el estado en un archivo, asegúrese de guardar primero en un archivo temporal y use File.Replace().
¿Al hacer "cerrar manualmente" significa que el usuario hace clic en la cruz de "cerrar ventana" en la esquina superior derecha de la ventana de la consola? –
Sospecho que lo que busca es "Al salir" de la línea de comandos ... tan pronto como se complete el método 'Principal 'de la aplicación de la consola, está fuera de su control y el usuario debe presionar la tecla Entrar para cerrar la ventana de línea de comando. –
@Martin. Sí, eso es lo que quise decir. Se actualizará para aclaración. – BlueVoodoo