Сховати вікно консолі від Process.Start C #


102

Я намагаюся створити процес на віддаленій машині, використовуючи клас System.Diagnostics.Process. Я в змозі створити процес. Але проблема полягає в тому, що створення послуги займає багато часу і відображається вікно консолі. Інша дратівлива річ - це те, що вікно консолі відображається поверх моєї форми Windows, і я не можу робити будь-які інші операції над цією формою. Я встановив усі властивості, як CreateNoWindow = true,

proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden

але все ж воно показує вікно консолі. навіть я перенаправив вихід і помилки, щоб розділити потік, але не пощастило.

Чи є інший спосіб приховати вікно консолі? Будь ласка, допоможіть мені.

Ось частина мого коду, яку я використовував для виконання 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();

Ви пробували налаштування proc.StartInfo.RedirectedStandardOutput = true? Я змусив це працювати з додатком для Windows.
poy

будь-яке остаточне рішення з повним зразком вихідного коду, що працює над цим?
Кікенет

У додатку консолі Windows для мене працювало просто встановлення UseShellExecute - без перенаправлення чи будь-чого іншого. Дивіться тут .
Пол

Що стосується відкривання вікна консолі та блокування форми, то слід запустити процес як Завдання або на новій темі
Райан Дулі

Чому ти встановлюєш UseShellExecuteі CreateNoWindowдвічі?
Майк Лоурі

Відповіді:


119

У мене була аналогічна проблема при спробі запуску процесу без показу вікна консолі. Я перевіряв декілька різних комбінацій значень властивостей, поки не знайшов такого, що демонстрував потрібну мені поведінку.

Ось сторінка з деталізацією, чому для UseShellExecuteвластивості потрібно встановити значення false.
http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.createnowindow.aspx

У розділі "Зауваження" на сторінці:

Якщо властивість UseShellExecute є істиною або властивості UserName та Password не є нульовими, значення властивості CreateNoWindow ігнорується і створюється нове вікно.

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

2
Хочете додати деякі додаткові деталі? , Чому це працює , а не хау .
аква

2
Це тому, що стандартний вихід змушує вікно існувати?
Деніз Скідмор

1
І, мабуть, ви не можете перенаправити стандартний вихід без налаштуванняstartInfo.UseShellExecute = false;
Деніз Скідмор

1
Мені цікаво, чому в цій іншій відповіді вони використовували UseShellExecute = true? stackoverflow.com/questions/2317767/c-process-start-hide
Деніз Скідмор

10
Я ніколи не зрозумію, чому люди ловлять виняток, який вони все одно кидають знову.
Сліпий

54

Мені пощастило з цією відповіддю, оскільки процес (Wix light.exe) по суті вийшов на обід і не прийшов додому на обід вчасно. Однак наступне добре працювало для мене:

Process p = new Process();
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
// etc, then start process

2
Працювали для мене - приємно і просто!
J c

2
Це справді має бути прийнятою відповіддю. Працює як шарм.
Вічний21

2
CreateNoWindow = trueне працював для мене, це зробив :)
Стефан Монов

3
Це працює лише для програми з вікном, консольна програма все ще показує вікно
Географ

18

Це має працювати, спробувати;


Додати системну довідку.

using System.Diagnostics;

Потім використовуйте цей код для запуску команди в прихованому вікні CMD.

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

11

Це не відображає вікно:

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

...
cmd.Start();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.