2014-02-13 7 views
5

geschlossen ist, schrieb ich dieses kleine Programm den Punkt der Frage zu demonstrieren:Wie eine Konsole app Ausfahrt anmutig machen, wenn es

using System; 
using System.IO; 
using System.Threading; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (var disp = new MyDisp()) 
     { 
      using (var ewhLocalExit = new EventWaitHandle(false, EventResetMode.ManualReset)) 
      { 
       Console.WriteLine("Enter Ctrl+C to terminate the app."); 
       Console.CancelKeyPress += (_, e) => 
       { 
        e.Cancel = true; 
        ewhLocalExit.Set(); 
       }; 
       ewhLocalExit.WaitOne(); 
      } 
     } 
     File.AppendAllText("Log.txt", "Terminated.\n"); 
    } 
} 


class MyDisp : IDisposable 
{ 
    public MyDisp() 
    { 
     File.AppendAllText("Log.txt", "Started.\n"); 
    } 

    public void Dispose() 
    { 
     File.AppendAllText("Log.txt", "Disposed.\n"); 
    } 
} 

Wenn ich es aus und drücken Sie Strg + C laufen, wie ich sehe „gestartet. Abgelegt. Abgeschlossen. " in Log.txt
Wenn ich es starte und schließe es mit der Maus, sehe ich nur "Gestartet".

Wie mache ich den Ausgang anmutig, so dass ich zumindest "Disposed" sehen konnte. ?

Antwort

2

Sie können DLLImport verwenden SetConsoleControlHandler zu importieren und verwenden Sie es einen Event-Handler für die geschlossene Veranstaltung (und andere) zu registrieren, hier ist ein Beispiel-Snippet, das es zeigt, Arbeits (es wird schreib in Log.txt geschlossen whem Sie das X klicken Sie auf die Konsole zu schließen):

class Program 
{ 
    [DllImport("Kernel32")] 
    public static extern bool SetConsoleCtrlHandler(HandlerRoutine Handler, bool Add); 

    // A delegate type to be used as the handler routine 
    // for SetConsoleCtrlHandler. 
    public delegate bool HandlerRoutine(CtrlTypes CtrlType); 

    // An enumerated type for the control messages 
    // sent to the handler routine. 
    public enum CtrlTypes 
    { 
     CTRL_C_EVENT = 0, 
     CTRL_BREAK_EVENT, 
     CTRL_CLOSE_EVENT, 
     CTRL_LOGOFF_EVENT = 5, 
     CTRL_SHUTDOWN_EVENT 
    } 

    private static bool ConsoleCtrlCheck(CtrlTypes ctrlType) 
    { 
     if (ctrlType == CtrlTypes.CTRL_CLOSE_EVENT) 
      File.AppendAllText(@"Log.txt", "closed"); 

     return true; 
    } 

    private static void Main(string[] args) 
    { 
     SetConsoleCtrlHandler(new HandlerRoutine(ConsoleCtrlCheck), true); 
     Console.WriteLine("Close me"); 
     Console.ReadLine(); 
    } 
} 

Source

2

Wenn Sie Ihre Konsolen-App mit der Maus schließen, indem Sie auf die Schaltfläche X klicken, werden Sie aufgefordert, den Prozess zu beenden.

Die Wi32 api hat einen SetConsoleControlHandler, mit dem Sie einen Handler für den Fall, dass verschiedene Dinge passieren können, angeben. Wenn der Handler mit CTRL_CLOSE_EVENT aufgerufen wird, wissen Sie, dass jemand versucht, Ihre Anwendung zu beenden.

Es ist ein Beispiel dafür, wie diese API verwenden here