新しいプロセスを開始するとき、使用するとどのような違いが生じますか
WindowStyle = hidden
または
CreateNoWindow = true
ProcessStartInfo
クラスのプロパティ?
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);
CreateNoWindowはコンソールモードアプリにのみ適用され、コンソールウィンドウは作成されません。
WindowStyleは、ネイティブWindows GUIアプリにのみ適用されます。これは、そのようなプログラムの WinMain()エントリポイント に渡されるヒントです。メインウィンドウの表示方法を指示する4番目の引数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
がデフォルトでtrueに設定されているため、そのすぐ下にあります
// UseShellExecute defaults to true, so use the WindowStyle
ProcessStartInfo startInfo = new ProcessStartInfo("IExplore.exe");
startInfo.WindowStyle = ProcessWindowStyle.Minimized;