Подтвердить что ты не робот

.NET - WindowStyle = hidden vs. CreateNoWindow = true?

Когда я запускаю новый процесс, какая разница, если я использую

WindowStyle = hidden

или

CreateNoWindow = true

свойства класса ProcessStartInfo?

4b9b3361

Ответ 1

Как сказал Ханс, 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); 

Ответ 2

CreateNoWindow применяется только к приложениям консольного режима, он не будет создавать консольное окно.

WindowStyle применяется только к родным приложениям с графическим интерфейсом Windows. Это подсказка передана точке входа WinMain() такой программы. Четвертый аргумент, nCmdShow, рассказывающий, как показать главное окно. Это та же подсказка, которая отображается как "Запуск" в ярлыке на рабочем столе. Обратите внимание, что "скрытый" не является вариантом, немногие правильно разработанные программы Windows выполняют этот запрос. Поскольку это снукер пользователя, он не может активировать программу и может только убить ее с помощью диспетчера задач.

Ответ 3

Используя 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;