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.
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
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).
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
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.
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)
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.
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:
Celles-ci semblent être de meilleures options si tout ce que vous voulez, c'est exécuter un processus.
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();
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);
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. ;)
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.
Ecrivez
ProcessStartInfo psi= new ProcessStartInfo("cmd.exe");
......
psi.CreateNoWindow = true;