Bei Konsolenanwendungen stehen diese nicht zur Verfügung. Um aber doch auf das unerwartete Beenden der Anwendung reagieren zu können, benutzen wir die Funktion SetConsoleCtrlHandler().
Mit dieser können wir bei der Anwendung eine Funktion registrieren, welche aufgerufen wird, falls das Programm beendet wird.
SetConsoleCtrlHandler() erwartet 2 Parameter, der erste ist das Delegate auf die zu nutzende Funktion und der 2 ein Boolean Wert, welcher angibt, ob der Handler hinzugefügt oder entfernt werden soll.
Die Funktion, welche beim Beenden aufgerufen wird, erhält als Parameter eine Enumeration, welche das Ereignis spezifiziert, welches das Beenden hervorruft, und muss immer false zurückgeben.
Im Code legen wir zuerst ein Delegate von der geforderten Signatur an:
private delegate bool EventHandler(CtrlType e)
Dann legen wir eine Variable mit dem eben erzeugten Typ an:
static EventHandler ConsoleCloseHandler.
Dieser weisen wir die zu benutzende Funktion zu und registrieren diese bei der Anwendung:
ConsoleCloseHandler += new EventHandler(Console_Closed);
SetConsoleCtrlHandler(ConsoleCloseHandler, true);
In der Funktion Console_Closed() ist der Grund des Beendes im Argument gespeichert, dieser kann abgefragt und verwendet werden.
Die von mir benutzte Aufzählung enthält 4 Ereignisse: Das Schließen der Konsole über die Tastenkombination Strg + C, das herkömmliche Schließen (z.B. durch Klicken von "X"), das Schließen wegen Abmeldung des Benutzers und das Schließen wegen Herunterfahrens.
Ich hoffe der folgende Quellcode verdeutlicht das Prinzip:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace ConsoleApplication1
{
class Program
{
[DllImport("Kernel32")]
private static extern bool SetConsoleCtrlHandler(EventHandler handler, bool add);
enum CtrlType
{
CTRL_C_EVENT = 0,
CTRL_CLOSE_EVENT = 2,
CTRL_LOGOFF_EVENT = 5,
CTRL_SHUTDOWN_EVENT = 6
}
private delegate bool EventHandler(CtrlType e);
static EventHandler ConsoleCloseHandler;
static void Main(string[] args)
{
ConsoleCloseHandler += new EventHandler(Console_Closed);
SetConsoleCtrlHandler(ConsoleCloseHandler, true);
while (true)
{
// Endlosschleife
}
}
private static bool Console_Closed(CtrlType e)
{
switch (e)
{
case CtrlType.CTRL_C_EVENT:
Console.WriteLine("Ctrl + C");
Console.ReadLine();
break;
case CtrlType.CTRL_LOGOFF_EVENT:
Console.WriteLine("Log Off");
Console.ReadLine();
break;
case CtrlType.CTRL_SHUTDOWN_EVENT:
Console.WriteLine("Shutdown");
Console.ReadLine();
break;
case CtrlType.CTRL_CLOSE_EVENT:
Console.WriteLine("Close");
Console.ReadLine();
break;
default:
Console.WriteLine("other");
Console.ReadLine();
break;
}
return true;
}
}
}