150 votes

Comment exécuter une application C# en console avec la console cachée

Existe-t-il un moyen de masquer la fenêtre de la console lors de l'exécution d'une application console ?

J'utilise actuellement une application Windows Forms pour lancer un processus de console, mais je ne veux pas que la fenêtre de console soit affichée pendant l'exécution de la tâche.

0 votes

Essayez d'exécuter l'application console à partir d'une tâche planifiée.

7voto

JCH2k Points 170

Si vous êtes intéressé par la sortie, vous pouvez utiliser cette fonction :

private static string ExecCommand(string filename, string arguments)
{
    Process process = new Process();
    ProcessStartInfo psi = new ProcessStartInfo(filename);
    psi.Arguments = arguments;
    psi.CreateNoWindow = true;
    psi.RedirectStandardOutput = true;
    psi.RedirectStandardError = true;
    psi.UseShellExecute = false;
    process.StartInfo = psi;

    StringBuilder output = new StringBuilder();
    process.OutputDataReceived += (sender, e) => { output.AppendLine(e.Data); };
    process.ErrorDataReceived += (sender, e) => { output.AppendLine(e.Data); };

    // run the process
    process.Start();

    // start reading output to events
    process.BeginOutputReadLine();
    process.BeginErrorReadLine();

    // wait for process to exit
    process.WaitForExit();

    if (process.ExitCode != 0)
        throw new Exception("Command " + psi.FileName + " returned exit code " + process.ExitCode);

    return output.ToString();
}

Il exécute le programme de la ligne de commande donnée, attend qu'il se termine et renvoie la sortie sous forme de chaîne.

4voto

Chris Bregg Points 48

Si vous créez un programme qui ne nécessite pas l'intervention de l'utilisateur, vous pouvez toujours le créer comme un service. Un service n'affichera pas d'interface utilisateur.

2voto

IDK anything Points 80

Ajoutez ceci à votre classe pour importer le fichier DLL :

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

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

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

Et ensuite, si vous voulez le cacher, utilisez cette commande :

 var handle = GetConsoleWindow();
 ShowWindow(handle, SW_HIDE);

Et si vous voulez montrer la console :

var handle = GetConsoleWindow();
ShowWindow(handle, SW_SHOW);

2voto

Aiso Milele Points 52

J'ai une solution générale à partager :

using System;
using System.Runtime.InteropServices;

namespace WhateverNamepaceYouAreUsing
{
    class Magician
    {
        [DllImport("kernel32.dll")]
        static extern IntPtr GetConsoleWindow();

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

        const int HIDE = 0;
        const int SHOW = 5;

        public static void DisappearConsole()
        {
            ShowWindow(GetConsoleWindow(), HIDE);
        }
    }
}

Il suffit d'inclure cette classe dans votre projet, et d'appeler Magician.DisappearConsole(); .

Une console clignote lorsque vous lancez le programme en cliquant dessus. Lorsqu'il est exécuté à partir de l'invite de commande, celle-ci disparaît très peu de temps après l'exécution.

Je fais cela pour un Bot Discord qui tourne en permanence en arrière-plan de mon ordinateur comme un processus invisible. C'était plus facile que de faire fonctionner TopShelf pour moi. Quelques tutoriels TopShelf ont échoué avant que je n'écrive ceci avec l'aide d'un code que j'ai trouvé ailleurs ;P

J'ai également essayé de modifier simplement les paramètres dans Visual Studio > Projet > Propriétés > Application pour lancer une application Windows au lieu d'une application console, et quelque chose dans mon projet m'a empêché de cacher ma console - peut-être parce que DSharpPlus demande de lancer une console au démarrage. Je n'en sais rien. Quelle que soit la raison, cette classe me permet de tuer facilement la console après qu'elle se soit affichée.

J'espère que ce magicien aidera quelqu'un ;)

1voto

Nathan Koop Points 9115

Je sais que je ne réponds pas exactement à ce que vous voulez, mais je me demande si vous posez la bonne question.

Pourquoi n'utilisez-vous pas l'un ou l'autre ?

  1. Service Windows
  2. créer un nouveau thread et exécuter votre processus sur celui-ci

Ceux-ci semblent être de meilleures options si tout ce que vous voulez est d'exécuter un processus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X