Questo codice funziona per catturare l'utente di chiudere la finestra di 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);
}
Attenzione delle restrizioni. Tu hai per rispondere rapidamente a questa notifica, hai 5 secondi per completare l'operazione. Prendi più tempo e Windows ucciderà il tuo codice senza troppe cerimonie. E il tuo metodo è chiamato in modo asincrono su un thread di lavoro, lo stato del programma è del tutto imprevedibile, quindi è probabile che il blocco sia richiesto. Assicurati assolutamente che l'interruzione non possa causare problemi. Ad esempio, quando si salva lo stato in un file, assicurarsi di salvare prima un file temporaneo e utilizzare File.Replace().
fonte
2011-01-10 13:10:02
"chiudendo manualmente" significa che l'utente fa clic sulla croce "finestra chiusa" nell'angolo in alto a destra della finestra della console? –
Sospetto che quello che stai cercando sia "On Exit" della riga di comando stessa ... non appena il metodo 'Main' dell'applicazione della console è terminato, è fuori dal tuo controllo e l'utente deve premere il tasto Invio per chiudere la finestra della riga di comando. –
@ Martin. Sì, questo è quello che intendevo. Aggiornerà per chiarimenti. – BlueVoodoo