Mostra / Nascondi la finestra della console di un'applicazione console C #


192

Ho cercato su Google informazioni su come nascondere la finestra della propria console. Sorprendentemente, le uniche soluzioni che ho trovato sono state le soluzioni confuse che hanno coinvolto la FindWindow()ricerca della finestra della console in base al titolo . Ho scavato un po 'più a fondo nell'API di Windows e ho scoperto che esiste un modo molto migliore e più semplice, quindi volevo pubblicarlo qui perché altri lo trovassero.

Come nascondi (e mostra) la finestra della console associata alla mia applicazione console C #?

Risposte:


268

Basta andare dell'applicazione delle proprietà e modificare il tipo di output da Applicazione console di Applicazione Windows .


9
Anche se questo non risponde alla domanda del PO, apprezzo molto che tu abbia dato questa risposta. Era esattamente quello di cui avevo bisogno :)
kayleeFrye_onDeck il

6
Questa non è una soluzione, perché in questo modo la finestra non può essere mostrata.
Michał Woliński,

6
Questa non è una soluzione a ciò che il poster ha chiesto.
KansaiRobot,

2
Benché ottima, questa soluzione non ti consente di controllare a livello di programmazione quando mostrare e nascondere la console. Diciamo che accetti un parametro della console che quando impostato vuoi nascondere la tua console (cioè modalità silenziosa, verbose = false)
TheLegendaryCopyCoder

3
Questo è fantastico quando si desidera aggiornare il file eseguibile principale in background e quindi eseguirlo. grazie
Ehsan il

266

Ecco come:

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

14
La finestra appare ancora momentaneamente all'inizio. Immagino che non ci sia modo di evitarlo, a meno che il tipo di applicazione non sia cambiato?
Ciaran Gallagher,

2
Sarebbe bello se ci fosse un modo per aggirare questo. In questo modo posso mostrare la console quando sono in modalità debug, ma eseguo il mio programma ed esco (senza finestra) quando sono in modalità di esecuzione normale.
Vaccano,

8
@Vaccano: è possibile rendere la propria applicazione un'applicazione console in modalità Debug solo modificando il csprojfile manualmente. Visual Studio non ha una GUI per farlo, ma rispetterà l'impostazione se modifichi il csprojfile correttamente.
Timwi,

3
Hai bisogno di:using System.Runtime.InteropServices;
Anthony Nichols,

5
Questa è una risposta molto bella, ma potrei aggiungere che un'altra opzione da aggiungere è const int SW_SHOWMINIMIZED = 2;e quindi ShowWindow(handle, SW_SHOWMINIMIZED); In questo modo la console non inizia nascosta, solo ridotta a icona.
KansaiRobot,

22

Perché hai bisogno di un'applicazione console se vuoi nascondere la console stessa? =)

Consiglio di impostare il tipo di output del progetto su Applicazione Windows anziché su Applicazione console. Non mostrerà la finestra della console, ma eseguirà tutte le azioni, come fanno le applicazioni console.


28
Perché potrebbe venire un momento in cui voglio davvero mostrarlo. Ad esempio, l'applicazione console cerca di eseguire cose e non infastidisce nessuno in quanto ha successo. Altrimenti, si apre e mi offre una CLI.
Janis F,

TopShelfti permette anche di correre Consolescome un servizio e questo si rompe
Mr Heelis,

Se vuoi che lo standard sia disponibile in una console, allora avrai bisogno di una console, così semplice.
Totte Karlsson,

20

È possibile eseguire l'inversione e impostare il tipo di output dell'applicazione su: Applicazione Windows. Quindi aggiungere questo codice all'inizio dell'applicazione.

[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
}

Questo codice mostrerà la console se lo showConsoleètrue


1
Mostra infatti la console con un cursore lampeggiante, ma né Console.WriteLine ("testo") né standardOutput.WriteLine ("testo") mostrano qualcosa nel mio caso. Manca qualcosa?
Ronny D'Hoore,

9

Vedi il mio post qui:

Mostra console nell'applicazione Windows

È possibile creare un'applicazione Windows (con o senza la finestra) e mostrare la console come desiderato. Utilizzando questo metodo la finestra della console non viene mai visualizzata a meno che tu non lo mostri esplicitamente. Lo uso per le applicazioni a doppia modalità che voglio eseguire in modalità console o gui a seconda di come vengono aperte.


Eccellente! il modo più semplice per nascondere la console è cambiare il tipo di progetto nell'applicazione Windows.

4

"Solo per nascondere" puoi:

Cambiare il tipo di uscita da applicazione console di Applicazione Windows ,

E invece di Console.Readline/keyte puoi usare new ManualResetEvent(false).WaitOne()alla fine per mantenere l'app in esecuzione.


1

Se non vuoi dipendere dal titolo della finestra usa questo:

    [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());

dobbiamo fornire il percorso completo del file dll in DllImport ("fullPath") /
Tushar Gupta - curioustushar,

0

Se non si verificano problemi con l'integrazione di un'applicazione batch di piccole dimensioni, esiste questo programma chiamato Cmdow.exe che consente di nascondere le finestre della console in base al titolo della console.

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

Aggiungi exe alla soluzione, imposta l'azione di compilazione su "Contenuto", imposta Copia nella directory di output come preferisci e cmdow nasconderà la finestra della console quando viene eseguita.

Per rendere nuovamente visibile la console, è sufficiente modificare gli Argomenti

HideConsole.StartInfo.Arguments = "MyConsole /Vis";
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.