Скрыть окно консоли из Process.Start C #

103

Я пытаюсь создать процесс на удаленном компьютере, используя класс 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 06
какое-либо окончательное решение с полным образцом исходного кода, работающим над этим?
Kiquenet
В консольном приложении Windows у меня сработало простое задание UseShellExecute - без перенаправления или чего-то еще. Смотрите здесь .
Пол
Что касается открытия окна консоли и блокировки формы, вы должны запустить процесс как задачу или в новом потоке
Райан Дули
Почему вы ставите UseShellExecuteи CreateNoWindowдважды?
Майк Лоури

Ответы:

120

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

Вот страница с подробным описанием того, почему для UseShellExecuteсвойства должно быть установлено значение false.
http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.createnowindow.aspx

В разделе "Примечания" на странице:

Если свойство UseShellExecute имеет значение true или свойства 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
Хотите добавить дополнительные детали? , Почему это работает , а не хау .
aqua
2
Это потому, что стандартный вывод заставляет окно существовать?
Дениз Скидмор
1
И, очевидно, вы не можете перенаправить стандартный вывод без настройкиstartInfo.UseShellExecute = false;
Дениз Скидмор
1
Мне любопытно, почему в этом другом ответе они использовали UseShellExecute = true? stackoverflow.com/questions/2317767/c-process-start-hide
Дениз Скидмор
10
Я никогда не пойму, почему люди ловят исключение, которое они просто бросают снова.
Blindy
54

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

Process p = new Process();
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
// etc, then start process
Джон Локвуд
источник
2
У меня получилось - красиво и просто!
J c
2
Это действительно должен быть принятый ответ. Работает как шарм.
Eternal21
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();
Леонардо Риньянезе
источник