Masquer la fenêtre de la console de Process.Start C #

102

J'essaie de créer un processus sur une machine distante en utilisant la classe System.Diagnostics.Process. Je suis capable de créer un processus. Mais le problème est que la création d'un service prend beaucoup de temps et la fenêtre de la console s'affiche. Une autre chose ennuyeuse est que la fenêtre de la console est affichée au-dessus de mon formulaire Windows et je ne peux pas faire d'autres opérations sur ce formulaire. J'ai défini toutes les propriétés comme CreateNoWindow = true,

proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden

mais il montre toujours la fenêtre de la console. même j'ai redirigé la sortie et les erreurs vers un flux séparé mais pas de chance.

Existe-t-il un autre moyen de masquer la fenêtre de la console? Sil te plait aide moi .

Voici la partie de mon code que j'ai utilisée pour exécuter la commande sc.

Process proc = new Process();
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
proc.StartInfo.FileName = "sc";
proc.StartInfo.Arguments = string.Format(@"\\SYS25 create MySvc binPath= C:\mysvc.exe");
proc.StartInfo.RedirectStandardError = false;
proc.StartInfo.RedirectStandardOutput = false;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.CreateNoWindow = true;
proc.Start();
proc.WaitForExit();
Prasad
la source
Avez-vous essayé le réglage proc.StartInfo.RedirectedStandardOutput = true? J'ai réussi à faire fonctionner cela avec une application Windows.
poy
une solution finale avec un exemple de code source complet fonctionnant à ce sujet?
Kiquenet
Dans une application de console Windows , le simple fait de configurer UseShellExecute - sans redirection ou autre - a fonctionné pour moi. Regardez ici .
Paul
En ce qui concerne l'ouverture de la fenêtre de la console et le verrouillage du formulaire, vous devez exécuter le processus en tant que tâche ou sur un nouveau fil de discussion
Ryan Dooley
Pourquoi vous installez-vous UseShellExecuteet CreateNoWindowdeux fois?
Mike Lowery

Réponses:

119

J'ai eu un problème similaire lors de la tentative de démarrage d'un processus sans afficher la fenêtre de la console. J'ai testé avec plusieurs combinaisons différentes de valeurs de propriété jusqu'à ce que j'en trouve une qui présente le comportement que je voulais.

Voici une page détaillant pourquoi la UseShellExecutepropriété doit être définie sur false.
http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.createnowindow.aspx

Sous la section Remarques sur la page:

Si la propriété UseShellExecute est true ou si les propriétés UserName et Password ne sont pas nulles, la valeur de la propriété CreateNoWindow est ignorée et une nouvelle fenêtre est créée.

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = fullPath;
startInfo.Arguments = args;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;

Process processTemp = new Process();
processTemp.StartInfo = startInfo;
processTemp.EnableRaisingEvents = true;
try
{
    processTemp.Start();
}
catch (Exception e)
{
    throw;
}
John Bartels
la source
2
Vous souhaitez ajouter des détails supplémentaires? Le pourquoi cela fonctionne plutôt que le comment .
aqua
2
Est-ce parce que la sortie standard force la fenêtre à exister?
Denise Skidmore
1
Et apparemment, vous ne pouvez pas rediriger la sortie standard sans réglagestartInfo.UseShellExecute = false;
Denise Skidmore
1
Je suis curieux de savoir pourquoi, dans cette autre réponse, ils ont utilisé UseShellExecute = true? stackoverflow.com/questions/2317767/c-process-start-hide
Denise Skidmore
10
Je ne comprendrai jamais pourquoi les gens attrapent une exception qu'ils lancent de toute façon.
Blindy
54

J'ai eu de la malchance avec cette réponse, le processus (Wix light.exe) sortant essentiellement pour déjeuner et ne rentrant pas à la maison à temps pour le dîner. Cependant, ce qui suit a bien fonctionné pour moi:

Process p = new Process();
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
// etc, then start process
John Lockwood
la source
2
A travaillé pour moi - agréable et simple!
J c
2
Cela devrait vraiment être la réponse acceptée. Fonctionne comme un charme.
Eternal21
2
CreateNoWindow = truen'a pas fonctionné pour moi, cela a fait :)
Stefan Monov
3
Cela fonctionne uniquement pour l'application avec fenêtre, l'application console toujours afficher la fenêtre
Géographe
18

Cela devrait fonctionner, essayez;


Ajoutez une référence système.

using System.Diagnostics;

Ensuite, utilisez ce code pour exécuter votre commande dans une fenêtre CMD cachée.

Process cmd = new Process();
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
cmd.StartInfo.Arguments = "Enter your command here";
cmd.Start();
Roshana Pitigala
la source
11

Cela ne montre pas la fenêtre:

Process cmd = new Process();
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
cmd.StartInfo.CreateNoWindow = true;

...
cmd.Start();
Leonardo Rignanese
la source