.NET - WindowStyle = скрытый против CreateNoWindow = true?
Когда я запускаю новый процесс, какая разница, если я использую
WindowStyle = hidden
или
CreateNoWindow = true
собственность ProcessStartInfo
учебный класс?
3 ответа
Как сказал Ганс, 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 GUI. Это подсказка, передаваемая точке входа 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
по умолчанию верно
// UseShellExecute defaults to true, so use the WindowStyle
ProcessStartInfo startInfo = new ProcessStartInfo("IExplore.exe");
startInfo.WindowStyle = ProcessWindowStyle.Minimized;