web-dev-qa-db-fra.com

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

Est-il possible 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 démarrer un processus de console, mais je ne souhaite pas que la fenêtre de la console s'affiche pendant l'exécution de la tâche.

134
Aaron Thomas

Si vous utilisez la classe ProcessStartInfo, vous pouvez définir le style de la fenêtre sur masqué. Dans le cas d'applications en mode console (non graphique), vous devez définir CreateNoWindow sur true:

System.Diagnostics.ProcessStartInfo start =
      new System.Diagnostics.ProcessStartInfo();
start.FileName = dir + @"\Myprocesstostart.exe";
start.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; //Hides GUI
start.CreateNoWindow = true; //Hides console
151
Adam Markowitz

Si vous avez écrit l'application console, vous pouvez la masquer par défaut.

Créez une nouvelle application de console, puis changez le type "Type de sortie" en "Application Windows" (indiqué dans les propriétés du projet).

187
Simon

Si vous utilisez Process Class, vous pouvez écrire

yourprocess.StartInfo.UseShellExecute = false;
yourprocess.StartInfo.CreateNoWindow = true;

before yourprocess.start(); et le processus seront masqués

67
nld

La réponse est simple: Accédez aux propriétés de votre application console (propriétés du projet) .Dans l'onglet "Application", remplacez simplement le "Type de sortie" par "Application Windows". C'est tout.

41
Cihan

Vous pouvez utiliser l'API FreeConsole pour détacher la console du processus:

[DllImport("kernel32.dll")]
static extern bool FreeConsole();

(bien sûr, cela ne s'applique que si vous avez accès au code source de l'application console)

20
Thomas Levesque

Si le résultat vous intéresse, 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 ligne de commande donné, attend sa fin et renvoie le résultat sous forme de chaîne.

7
JCH2k

Si vous créez un programme qui ne nécessite pas l'intervention de l'utilisateur, vous pouvez toujours le créer en tant que service. Un service ne montrera aucune sorte d'interface utilisateur.

4
Chris Bregg

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 non plus:

  1. service de windows
  2. créer un nouveau fil et exécuter votre processus sur celui-ci

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

1
Nathan Koop

Basé sur la réponse d'Adam Markowitz ci-dessus, la suite a fonctionné pour moi:

process = new Process();
process.StartInfo = new ProcessStartInfo("cmd.exe", "/k \"" + CmdFilePath + "\"");
process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
//process.StartInfo.UseShellExecute = false;
//process.StartInfo.CreateNoWindow = true;
process.Start();
1
Volcan Baru

Ajoutez ceci à votre classe pour importer le fichier DLL:

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

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

Et puis 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);
1
IDK anything

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

Incluez simplement cette classe dans votre projet et appelez Magician.DisappearConsole();.

Une console clignotera au démarrage du programme en cliquant dessus. Lors de l'exécution à partir de l'invite de commande, l'invite de commande disparaît très peu de temps après son exécution.

Je le fais pour un Bot Discord qui fonctionne à tout jamais en arrière-plan de mon ordinateur en tant que processus invisible. C'était plus facile que de faire travailler TopShelf pour moi. Quelques tutoriels TopShelf m'ont échoué avant que j'écrive ceci avec l'aide du code trouvé ailleurs. ; P

J'ai également essayé simplement de modifier les paramètres dans Visual Studio> Projet> Propriétés> Application pour les lancer en tant qu'application Windows plutôt qu'en tant qu'application console. Mon projet a ainsi été empêché de masquer ma console - peut-être parce que DSharpPlus demande à lancer une console au démarrage . Je ne sais pas. Quelle que soit la raison, cette classe me permet de tuer facilement la console après son apparition.

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

1
Lucas Jarrett

Bien que, comme d'autres réponses l'ont indiqué ici, vous pouvez modifier le "Type de sortie" en "Application Windows", veuillez noter que cela signifie que vous ne pourrez pas utiliser Console.In comme il deviendra un NullStreamReader.

Console.Out et Console.Error semble toujours fonctionner correctement cependant.

0
kjbartel

Ecrivez

ProcessStartInfo psi= new ProcessStartInfo("cmd.exe");
......

psi.CreateNoWindow = true;
0
Navin