Gabor
Gabor

Reputation: 1676

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

When I start a new process, what difference does it make if I use the

WindowStyle = Hidden

or the

CreateNoWindow = true

property of the ProcessStartInfo class?

Upvotes: 74

Views: 43451

Answers (3)

Hans Passant
Hans Passant

Reputation: 941545

CreateNoWindow only applies to console mode apps, it won't create the console window.

WindowStyle only applies to native Windows GUI apps. It is a hint passed to the WinMain() entry point of such a program. Fourth argument, nCmdShow, telling it how to show its main window. This is the same hint that appears as the "Run" setting in a desktop shortcut. Note that "hidden" is not an option there, few properly designed Windows program honor that request. Since that snookers the user, they can't get the program activated anymore and can only kill it with Task Manager.

Upvotes: 25

Liz
Liz

Reputation: 8958

As Hans said, WindowStyle is a recommendation passed to the process, the application can choose to ignore it.

CreateNoWindow controls how the console works for the child process, but it doesn't work alone.

CreateNoWindow works in conjunction with UseShellExecute as follows:

To run the process without any window:

ProcessStartInfo info = new ProcessStartInfo(fileName, arg); 
info.CreateNoWindow = true; 
info.UseShellExecute = false;
Process processChild = Process.Start(info); 

To run the child process in its own window (new console)

ProcessStartInfo info = new ProcessStartInfo(fileName, arg); 
info.UseShellExecute = true; // which is the default value.
Process processChild = Process.Start(info); // separate window

To run the child process in the parent's console window

ProcessStartInfo info = new ProcessStartInfo(fileName, arg); 
info.UseShellExecute = false; // causes consoles to share window 
Process processChild = Process.Start(info); 

Upvotes: 92

SwDevMan81
SwDevMan81

Reputation: 49978

Using Reflector, it looks like WindowStyle is used if UseShellExecute is set, otherwise it uses CreateNoWindow.

In MSDN's example, you can see how they set it:

// 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();

In the other example, its just below because UseShellExecute is defaulted to true

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

Upvotes: 16

Related Questions