Anzeigen / Ausblenden des Konsolenfensters einer C # -Konsolenanwendung

191

Ich googelte nach Informationen darüber, wie man das eigene Konsolenfenster versteckt. Erstaunlicherweise waren die einzigen Lösungen, die ich finden konnte, hackige Lösungen, bei denen FindWindow()das Konsolenfenster anhand seines Titels gefunden wurde . Ich habe mich etwas tiefer mit der Windows-API befasst und festgestellt, dass es einen viel besseren und einfacheren Weg gibt. Deshalb wollte ich ihn hier veröffentlichen, damit andere ihn finden können.

Wie können Sie das Konsolenfenster ausblenden (und anzeigen), das meiner eigenen C # -Konsolenanwendung zugeordnet ist?

Timwi
quelle

Antworten:

265

Hier ist wie:

using System.Runtime.InteropServices;

[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();

[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

const int SW_HIDE = 0;
const int SW_SHOW = 5;

var handle = GetConsoleWindow();

// Hide
ShowWindow(handle, SW_HIDE);

// Show
ShowWindow(handle, SW_SHOW);
Timwi
quelle
14
Das Fenster erscheint noch kurz am Anfang. Ich denke, daran führt kein Weg vorbei, es sei denn, der Anwendungstyp wird geändert.
Ciaran Gallagher
2
Es wäre schön, wenn es einen Ausweg gäbe. Auf diese Weise kann ich die Konsole anzeigen, wenn ich mich im Debug-Modus befinde, aber einfach mein Programm ausführen und beenden (ohne Fenster), wenn ich mich im normalen Ausführungsmodus befinde.
Vaccano
8
@Vaccano: Es ist möglich, Ihre Anwendung im Debug-Modus zu einer Konsolenanwendung zu machen, indem Sie die csprojDatei manuell bearbeiten . Visual Studio verfügt hierfür nicht über eine grafische Benutzeroberfläche csproj. Die Einstellung wird jedoch berücksichtigt, wenn Sie die Datei korrekt bearbeiten .
Timwi
3
Need:using System.Runtime.InteropServices;
Anthony Nichols
5
Dies ist eine sehr schöne Antwort, aber ich könnte hinzufügen, dass eine weitere Option zum Hinzufügen ist const int SW_SHOWMINIMIZED = 2;und dann auf ShowWindow(handle, SW_SHOWMINIMIZED); diese Weise die Konsole nicht ausgeblendet, sondern nur minimiert wird.
KansaiRobot
265

Gehen Sie einfach zu den Eigenschaften der Anwendung und ändern Sie den Ausgabetyp von Konsolenanwendung in Windows-Anwendung .

Fahad
quelle
9
Auch wenn dies die Frage des OP nicht beantwortet, schätze ich es sehr, dass Sie diese Antwort geben. Es war genau das, was ich brauchte :)
kayleeFrye_onDeck
6
Dies ist keine Lösung, da auf diese Weise kein Fenster angezeigt werden kann.
Michał Woliński
6
Dies ist keine Lösung für die Fragen des Posters.
KansaiRobot
1
Mit dieser Lösung können Sie zwar programmgesteuert steuern, wann die Konsole ein- und ausgeblendet werden soll. Nehmen wir an, Sie akzeptieren einen Konsolenparameter, bei dessen Einstellung Sie Ihre Konsole ausblenden möchten (dh stiller Modus, ausführlich = falsch)
TheLegendaryCopyCoder
3
Dies ist ideal, wenn Sie Ihre ausführbare Hauptdatei im Hintergrund aktualisieren und dann ausführen möchten. danke
Ehsan
22

Warum benötigen Sie eine Konsolenanwendung, wenn Sie die Konsole selbst ausblenden möchten? =)

Ich empfehle, den Projektausgabetyp auf Windows-Anwendung anstelle von Konsolenanwendung festzulegen. Das Konsolenfenster wird nicht angezeigt, es werden jedoch alle Aktionen ausgeführt, wie dies bei der Konsolenanwendung der Fall ist.

Sasha
quelle
28
Weil es eine Zeit geben könnte, in der ich es tatsächlich zeigen möchte. Die Konsolenanwendung versucht, Dinge auszuführen, und stört niemanden, solange sie erfolgreich ist. Wenn nicht, erscheint es und bietet mir eine CLI an.
Janis F
auch TopShelfermöglicht es Ihnen , laufen Consolesals Dienst und das bricht , dass
Herr Heelis
Wenn Standard Out in einer Konsole verfügbar sein soll, benötigen Sie eine einfache Konsole.
Totte Karlsson
20

Sie können das Gegenteil tun und den Anwendungsausgabetyp auf: Windows-Anwendung festlegen. Fügen Sie diesen Code dann am Anfang der Anwendung hinzu.

[DllImport("kernel32.dll", EntryPoint = "GetStdHandle", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr GetStdHandle(int nStdHandle);

[DllImport("kernel32.dll", EntryPoint = "AllocConsole", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int AllocConsole();

private const int STD_OUTPUT_HANDLE = -11;
private const int MY_CODE_PAGE = 437;
private static bool showConsole = true; //Or false if you don't want to see the console

static void Main(string[] args)
{
    if (showConsole)
    {
        AllocConsole();
        IntPtr stdHandle = GetStdHandle(STD_OUTPUT_HANDLE);
        Microsoft.Win32.SafeHandles.SafeFileHandle safeFileHandle = new Microsoft.Win32.SafeHandles.SafeFileHandle(stdHandle, true);
        FileStream fileStream = new FileStream(safeFileHandle, FileAccess.Write);
        System.Text.Encoding encoding = System.Text.Encoding.GetEncoding(MY_CODE_PAGE);
        StreamWriter standardOutput = new StreamWriter(fileStream, encoding);
        standardOutput.AutoFlush = true;
        Console.SetOut(standardOutput);
    }

    //Your application code
}

Dieser Code zeigt die Konsole an, wenn dies der Fall showConsoleisttrue

Maiko Kingma
quelle
Es zeigt zwar die Konsole mit einem blinkenden Cursor, aber weder Console.WriteLine ("Text") noch standardOutput.WriteLine ("Text") zeigen in meinem Fall etwas. Fehlt etwas?
Ronny D'Hoore
9

Siehe meinen Beitrag hier:

Konsole in Windows-Anwendung anzeigen

Sie können eine Windows-Anwendung (mit oder ohne Fenster) erstellen und die Konsole wie gewünscht anzeigen. Mit dieser Methode wird das Konsolenfenster nur angezeigt, wenn Sie es explizit anzeigen. Ich verwende es für Dual-Mode-Anwendungen, die ich je nach Öffnung entweder im Konsolen- oder im GUI-Modus ausführen möchte.

Anthony
quelle
Ausgezeichnet! Der einfachste Weg, die Konsole auszublenden, besteht darin, den Projekttyp in eine Windows-Anwendung zu ändern.
4

"Nur um sich zu verstecken" können Sie:

Ändern Sie den Ausgabetyp von Konsolenanwendung in Windows-Anwendung .

Und stattdessen Console.Readline/keykönnen Sie new ManualResetEvent(false).WaitOne()am Ende verwenden, um die App am Laufen zu halten.

NT
quelle
1

Wenn Sie nicht vom Fenstertitel abhängen möchten, verwenden Sie Folgendes:

    [DllImport("user32.dll")]
    static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

...

    IntPtr h = Process.GetCurrentProcess().MainWindowHandle;
    ShowWindow(h, 0);
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new FormPrincipale());
Lappen
quelle
Wir müssen den vollständigen Pfad der DLL-Datei in DllImport ("fullPath") /
Tushar Gupta - curioustushar
0

Wenn Sie keine Probleme beim Integrieren einer Kleinserienanwendung haben, gibt es dieses Programm namens Cmdow.exe , mit dem Sie Konsolenfenster basierend auf dem Konsolentitel ausblenden können.

Console.Title = "MyConsole";
System.Diagnostics.Process HideConsole = new System.Diagnostics.Process();
HideConsole.StartInfo.UseShellExecute = false;
HideConsole.StartInfo.Arguments = "MyConsole /hid";
HideConsole.StartInfo.FileName = "cmdow.exe";
HideConsole.Start();

Fügen Sie die Exe zur Lösung hinzu, setzen Sie die Build-Aktion auf "Inhalt", setzen Sie "In Ausgabeverzeichnis kopieren" auf das, was zu Ihnen passt, und cmdow blendet das Konsolenfenster aus, wenn es ausgeführt wird.

Um die Konsole wieder sichtbar zu machen, ändern Sie einfach die Argumente

HideConsole.StartInfo.Arguments = "MyConsole /Vis";
ScilsOff
quelle