Ten kod działa złapać użytkownikowi zamykając okno konsoli:
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);
}
Strzeż ograniczeń. Musisz mieć, aby szybko odpowiedzieć na to powiadomienie, masz 5 sekund na wykonanie zadania. Zaczekaj dłużej, a Windows zabije Twój kod bezceremonialnie. A twoja metoda jest asynchronicznie na wątku roboczym, stan programu jest całkowicie nieprzewidywalny, więc blokowanie będzie prawdopodobnie wymagane. Upewnij się, że przerywanie nie może powodować problemów. Na przykład, zapisując stan do pliku, upewnij się, że najpierw zapisałeś w pliku tymczasowym i użyłeś File.Replace().
Czy przez "ręczne zamykanie" oznacza, że użytkownik klika krzyżyk "zamknij okno" w prawym górnym rogu okna konsoli? –
Podejrzewam, że to, o co prosisz, to "On Exit" samej linii komend .. jak tylko zostanie wykonana metoda 'Main' aplikacji konsoli, to jest poza twoją kontrolą i użytkownik musi nacisnąć klawisz Enter, aby zamknąć okno wiersza poleceń. –
@Martin. Tak, właśnie o to mi chodziło. Zostanie zaktualizowany w celu wyjaśnienia. – BlueVoodoo