Когда я запускаю новый процесс, какая разница, если я использую
WindowStyle = hidden
или
CreateNoWindow = true
свойства класса ProcessStartInfo
?
Когда я запускаю новый процесс, какая разница, если я использую
WindowStyle = hidden
или
CreateNoWindow = true
свойства класса ProcessStartInfo
?
Как сказал Ханс, WindowStyle - это рекомендация, переданная процессу, приложение может игнорировать его.
CreateNoWindow контролирует, как консоль работает для дочернего процесса, но она не работает сама по себе.
CreateNoWindow работает совместно с UseShellExecute следующим образом:
Чтобы запустить процесс без какого-либо окна:
ProcessStartInfo info = new ProcessStartInfo(fileName, arg);
info.CreateNoWindow = true;
info.UseShellExecute = false;
Process processChild = Process.Start(info);
Чтобы запустить дочерний процесс в его собственном окне (новая консоль)
ProcessStartInfo info = new ProcessStartInfo(fileName, arg);
info.UseShellExecute = true; // which is the default value.
Process processChild = Process.Start(info); // separate window
Запуск дочернего процесса в окне родительской консоли
ProcessStartInfo info = new ProcessStartInfo(fileName, arg);
info.UseShellExecute = false; // causes consoles to share window
Process processChild = Process.Start(info);
CreateNoWindow применяется только к приложениям консольного режима, он не будет создавать консольное окно.
WindowStyle применяется только к родным приложениям с графическим интерфейсом Windows. Это подсказка передана точке входа WinMain() такой программы. Четвертый аргумент, nCmdShow, рассказывающий, как показать главное окно. Это та же подсказка, которая отображается как "Запуск" в ярлыке на рабочем столе. Обратите внимание, что "скрытый" не является вариантом, немногие правильно разработанные программы Windows выполняют этот запрос. Поскольку это снукер пользователя, он не может активировать программу и может только убить ее с помощью диспетчера задач.
Используя Reflector, это выглядит как WindowStyle
используется, если UseShellExecute
, в противном случае он использует CreateNoWindow
.
В примере MSDN вы можете увидеть, как они его устанавливают:
// Using CreateNoWindow requires UseShellExecute to be false
myProcess.StartInfo.UseShellExecute = false;
// You can start any process, HelloWorld is a do-nothing example.
myProcess.StartInfo.FileName = "C:\\HelloWorld.exe";
myProcess.StartInfo.CreateNoWindow = true;
myProcess.Start();
В другом примере его чуть ниже, потому что UseShellExecute
по умолчанию имеет значение true
// UseShellExecute defaults to true, so use the WindowStyle
ProcessStartInfo startInfo = new ProcessStartInfo("IExplore.exe");
startInfo.WindowStyle = ProcessWindowStyle.Minimized;