Question

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 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.

Était-ce utile?

La solution

Si vous utilisez la classe ProcessStartInfo , vous pouvez définir le style de la fenêtre sur masqué:

System.Diagnostics.ProcessStartInfo start =
      new System.Diagnostics.ProcessStartInfo();
start.FileName = dir + @"\Myprocesstostart.exe";
start.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;

Autres conseils

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

Créez une nouvelle application de console, puis modifiez le & type; Type de sortie " saisissez " Application Windows " (fait dans les propriétés du projet)

Si vous utilisez Process Class, vous pouvez écrire

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

avant votre processus.start (); et le processus seront masqués

La réponse simple est que: Accédez aux propriétés de votre application console (propriétés du projet) .Dans la " Application " onglet, il suffit de changer le " Type de sortie " sur "Application Windows". C'est tout.

Vous pouvez utiliser le FreeConsole API permettant de 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)

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 spécifié, attend sa fin et renvoie le résultat sous forme de chaîne.

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.

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 windows
  2. créez un nouveau thread et exécutez votre processus sur ce

Cela semble être une meilleure option si tout ce que vous voulez, c'est d'exécuter un processus.

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 si vous voulez le cacher, utilisez cette commande:

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

Et si vous souhaitez afficher la console:

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

D'après 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();

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 clignote lorsque vous démarrez le 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 s’exécute à l’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é de modifier simplement les paramètres dans Visual Studio > Projet > Propriétés > Application à lancer en tant qu'application Windows au lieu d'une application de console, et quelque chose dans mon projet l'a empêché de cacher ma console - peut-être parce que DSharpPlus exige le lancement d'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.

Espérons que ce magicien aide quelqu'un. ;)

Il suffit d'écrire

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

psi.CreateNoWindow = true;

Comme d'autres réponses l'ont déjà indiqué, vous pouvez modifier le "Type de sortie". "Application Windows", sachez que cela signifie que vous ne pourrez pas utiliser Console.In , car il deviendra un NullStreamReader.

Console.Out et Console.Error semblent toutefois fonctionner correctement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top