Angehängte Console kann nicht direkt geschlossen werden.

    • C#

      Angehängte Console kann nicht direkt geschlossen werden.

      Hallo Leute,
      wir haben ein umfangreiches Programm, bei dem Logausgaben in eine Console geschrieben werden.
      Bedauerlich ist der Umstand, dass eine angehängte Console Herr über das anhängende Programm ist, da ein Beenden der Console das Hauptprogramm gnadenlos beendet.
      Untersucht wurde das im Thread Angehängte Console soll nicht geschlossen werden können.
      Falls in der Form_Closing des Hauptprogramms abgefragt wird, ob Daten zu speichern sind, wird das einfach übersprungen, der Code kommt nicht zur Ausführung.
      Probiert das aus, indem Ihr mit NativeMethods.AllocConsole(); eine Console anhängt und in das Form_Closing-Event eine MessageBox aufruft und dann die Console direkt schließt.
      • Der Schließen-Button (x) im Console-Fenster muss ge-disabled werden.
        Dazu wird das System-Menü der Console gelöscht. Das wirkt sowohl auf den (x)-Button rechts als auch auf das Menü links in der Titelzeile der Console.
        Damit das Fenster dsann schick aussieht, konvertieren wir es in ein ToolWindow, da verschwinden die Minimize- und Maximize-Button.
      Nun kann die Console allerdings immer noch über ihr Taskbar-Icon geschlossen werden.
      Also ist es erforderlich, das Icon der Console aus der Taskbar zu entfernen.
      Mit Hilfe von @Fakiz , @Gonger96 und PInvoke kam dabei folgende Lösung raus:
      • Es wird ein OLE-Interface ITaskbarList instanziiert und über dieses das Icon der Console in der TaskBar gelöscht.
        Das ist übrigens derselbe Mechanismus wie bei Form.ShowInTaskBar.
      Im Code sind folgende Klassen enthalten:
      • MainForm - das Hauptfenster der Anwendung.
        Es hat 3 Button:
        Remove - Das Taskbar-Icon der Console wird gelöscht,
        Write - Es wird ein Text in die Console geschrieben,
        Clear - Das Console-Fenster wird gelöscht.
        Das Console-Fenster folgt dem Hauptfenster beim Minimieren / Wiederherstellen.
      • NativeMethods - eine Aufsammlung von API-Methoden und Konstanten, die gebraucht werden.
        Es werden folgende Methoden zur allgemeinen Nutzung zur Verfügung gestellt:
        AppendConsole() - Es wird eine Console an das Hauptprogramm angehängt.
        RemoveConsoleFromTaskBar() - Das Icon der Console in der TaskBar wird entfernt.
        ShowConsole(bool show) - Das Console-Fenster wird minimiert bzw. angezeigt.
      • ITaskbarList - ein OLE-Interface
      • CoTaskbarList - eine Implementierung des ITaskbarList-Interfaces.
      Der Code läuft sowohl unter x64 als auch unter x86.
      Aloo dann - Viel Spaß.
      ConsoleDoNotClose.zip
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!