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

当我启动一个新进程时,如果使用

WindowStyle = Hidden

或者

CreateNoWindow = true

ProcessStartInfo类的属性?

40021 次浏览

CreateNoWindow 只适用于控制台模式的应用程序,它不会创建控制台窗口。

WindowStyle 只适用于本地 WindowsGUI 应用程序。它是传递给此类程序的 WinMain ()入口点的提示。第四个参数 nCmdShow,告诉它如何显示其主窗口。这个提示与桌面快捷方式中的“ Run”设置相同。请注意,“隐藏”不是一个选项,很少有正确设计的 Windows 程序尊重这一要求。由于斯诺克用户,他不能得到程序激活了,只能杀死它与任务管理器。

通过使用反射器,如果设置了 UseShellExecute,那么就使用 WindowStyle,否则就使用 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;

正如 Hans 所说,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);