Afficher / Masquer la fenêtre de console d'une application de console C #

197

J'ai cherché sur Google des informations sur la façon de cacher sa propre fenêtre de console. Étonnamment, les seules solutions que j'ai pu trouver étaient des solutions de piratage qui impliquaient FindWindow()de trouver la fenêtre de la console par son titre . J'ai creusé un peu plus profondément l'API Windows et j'ai trouvé qu'il y avait un moyen bien meilleur et plus simple, alors je voulais le publier ici pour que d'autres le trouvent.

Comment masquer (et afficher) la fenêtre de console associée à ma propre application de console C #?

Timwi
la source

Réponses:

281

Il suffit d' aller de l'application Propriétés et changer le type de sortie de la console d' application à application Windows .

Fahad
la source
Je me sens tellement vide, cela semble si évident quand on me le fait remarquer. J'ai trouvé cela si difficile à google.
Accroupissez-vous
11
Même si cela ne répond pas à la question du PO, j'apprécie vraiment que vous ayez donné cette réponse. C'était exactement ce dont j'avais besoin :)
kayleeFrye_onDeck
7
Ce n'est pas une solution, car cette fenêtre ne peut pas être affichée.
Michał Woliński
7
Ce n'est pas une solution à ce que l'affiche a demandé.
KansaiRobot
2
Bien qu'elle soit excellente, cette solution ne vous permet pas de contrôler par programme quand afficher et masquer la console. Disons que vous acceptez un paramètre de console qui, lorsqu'il est défini, vous souhaitez masquer votre console (c'est-à-dire mode silencieux, verbose = false)
TheLegendaryCopyCoder
279

Voici comment:

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
la source
15
La fenêtre apparaît encore momentanément au début. Je suppose qu'il n'y a aucun moyen de contourner cela, à moins que le type d'application ne soit modifié?
Ciaran Gallagher
2
Ce serait bien s'il y avait un moyen de contourner cela. De cette façon, je peux afficher la console lorsque je suis en mode débogage, mais exécutez simplement mon programme et quittez (sans fenêtre) lorsque je suis en mode d'exécution normal.
Vaccano du
8
@Vaccano: Il est possible de faire de votre application une application console en mode Debug uniquement en éditant le csprojfichier manuellement. Visual Studio n'a pas d'interface graphique pour ce faire, mais il honorera le paramètre si vous modifiez le csprojfichier correctement.
Timwi
4
Besoin:using System.Runtime.InteropServices;
Anthony Nichols
7
C'est une très bonne réponse, mais je pourrais ajouter qu'une autre option à ajouter est const int SW_SHOWMINIMIZED = 2;et puis ShowWindow(handle, SW_SHOWMINIMIZED); De cette façon, la console démarre non masquée, juste minimisée.
KansaiRobot
22

Pourquoi avez-vous besoin d'une application console si vous souhaitez masquer la console elle-même? =)

Je recommande de définir le type de sortie du projet sur Application Windows au lieu de l'application Console. Il ne montrera pas la fenêtre de la console, mais exécutera toutes les actions, comme le fait l'application de la console.

Sasha
la source
30
Parce qu'il pourrait arriver un moment où je veux vraiment le montrer. Par exemple, l'application console essaie d'effectuer des tâches et ne dérange personne tant qu'elle réussit. Sinon, il apparaît et me propose une CLI.
Janis F
TopShelfvous permet également de fonctionner en Consolestant que service et cela brise cela
Mr Heelis
Si vous voulez que la sortie standard soit disponible dans une console, vous aurez besoin d'une console, aussi simple que cela.
Totte Karlsson le
21

Vous pouvez faire l'inverse et définir le type de sortie d'application sur: Application Windows. Ajoutez ensuite ce code au début de l'application.

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

Ce code affiche la console si showConsoleesttrue

Maiko Kingma
la source
3
Il montre en effet la console avec un curseur clignotant, mais ni Console.WriteLine ("texte") ni standardOutput.WriteLine ("texte") ne montre quoi que ce soit dans mon cas. Il manque quelque chose?
Ronny D'Hoore
11

Voir mon message ici:

Afficher la console dans l'application Windows

Vous pouvez créer une application Windows (avec ou sans fenêtre) et afficher la console comme vous le souhaitez. En utilisant cette méthode, la fenêtre de la console n'apparaît que si vous l'avez explicitement affichée. Je l'utilise pour les applications bi-mode que je souhaite exécuter en mode console ou en mode interface graphique en fonction de la façon dont elles sont ouvertes.

Anthony
la source
1
Excellent! le moyen le plus simple de masquer la console est de changer le type de projet en application Windows.
5

«Juste pour vous cacher», vous pouvez:

Modifier le type de sortie de la console d' application à application Windows ,

Et au lieu de cela, Console.Readline/keyvous pouvez utiliser new ManualResetEvent(false).WaitOne()à la fin pour maintenir l'application en cours d'exécution.

NT
la source
2

Si vous ne voulez pas dépendre du titre de la fenêtre, utilisez ceci:

    [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());
chiffon
la source
nous devons donner le chemin complet du fichier dll dans DllImport ("fullPath") /
Tushar Gupta - curioustushar
0

Si vous n'avez pas de problème pour intégrer une petite application par lots, il existe ce programme appelé Cmdow.exe qui vous permettra de masquer les fenêtres de la console en fonction du titre de la 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();

Ajoutez l'exe à la solution, définissez l'action de génération sur "Contenu", définissez Copier dans le répertoire de sortie sur ce qui vous convient et cmdow masquera la fenêtre de la console lorsqu'elle sera exécutée.

Pour rendre la console à nouveau visible, il vous suffit de modifier les arguments

HideConsole.StartInfo.Arguments = "MyConsole /Vis";
ScilsOff
la source