.NET - WindowStyle = скрытый против CreateNoWindow = true? - PullRequest
62 голосов
/ 23 февраля 2011

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

WindowStyle = hidden

или

CreateNoWindow = true

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

Ответы [ 3 ]

75 голосов
/ 23 февраля 2011

Как сказал Ганс, 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); 
17 голосов
/ 23 февраля 2011

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

WindowStyle применяется только к собственным приложениям Windows GUI.Это подсказка, передаваемая WinMain () точке входа такой программы.Четвёртый аргумент, nCmdShow, рассказывает, как показать главное окно.Это та же подсказка, которая отображается в настройке «Выполнить» в ярлыке на рабочем столе.Обратите внимание, что «скрытый» там не вариант, лишь немногие должным образом разработанные программы Windows выполняют этот запрос.Так как это перехватывает пользователя, он больше не может активировать программу и может убить ее только с помощью диспетчера задач.

13 голосов
/ 23 февраля 2011

Используя 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 по умолчанию имеет значение

// UseShellExecute defaults to true, so use the WindowStyle
ProcessStartInfo startInfo = new ProcessStartInfo("IExplore.exe");
startInfo.WindowStyle = ProcessWindowStyle.Minimized;
...