web-dev-qa-db-ja.com

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

新しいプロセスを開始するとき、使用するとどのような違いが生じますか

WindowStyle = hidden

または

CreateNoWindow = true

ProcessStartInfoクラスのプロパティ?

62
Gabor

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); 
76
Liz

CreateNoWindowはコンソールモードアプリにのみ適用され、コンソールウィンドウは作成されません。

WindowStyleは、ネイティブWindows GUIアプリにのみ適用されます。これは、そのようなプログラムの WinMain()エントリポイント に渡されるヒントです。メインウィンドウの表示方法を指示する4番目の引数nCmdShow。これは、デスクトップショートカットの「実行」設定として表示されるのと同じヒントです。 「非表示」はオプションではないことに注意してください。適切に設計されたWindowsプログラムはほとんどその要求を受け入れません。ユーザーをスヌークするため、プログラムをアクティブにすることはできず、タスクマネージャーでのみ強制終了できます。

17
Hans Passant

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;
13
SwDevMan81