wake-up-neo.com

Anzeigen / Ausblenden des Konsolenfensters einer C # -Konsolenanwendung

Ich habe nach Informationen zum Ausblenden des eigenen Konsolenfensters gesucht. Erstaunlicherweise waren die einzigen Lösungen, die ich finden konnte, Hacky-Lösungen, die FindWindow() betrafen, um das Konsolenfenster anhand seines Titels zu finden. Ich habe mich ein bisschen eingehender 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.

Wie kann das mit meiner eigenen C # -Konsolenanwendung verknüpfte Konsolenfenster ausgeblendet (und angezeigt) werden?

167
Timwi

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);
235
Timwi

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

234
Fahad

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

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

22
Sasha

Sie können das Umgekehrte tun und den Ausgabetyp der Anwendung auf Windows-Anwendung setzen. Fügen Sie dann diesen Code 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 showConsoletrue ist.

15
Maiko Kingma

Seht 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 ausdrücklich anzeigen. Ich verwende es für Dual-Mode-Anwendungen, die je nach dem, wie sie geöffnet sind, entweder im Konsolen- oder im GUI-Modus ausgeführt werden sollen.

9
Anthony

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

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

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

3
N T

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());
1
rag

Wenn Sie keine Probleme bei der Integration einer kleinen Stapelanwendung haben, gibt es dieses Programm mit dem Namen 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-Datei zur Projektmappe hinzu, setzen Sie die Erstellungsaktion auf "Inhalt", setzen Sie die Option "In Ausgabeverzeichnis kopieren" auf Ihren Bedarf 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";
0
ScilsOff