Process.Start C#からコンソールウィンドウを非表示にする


102

System.Diagnostics.Processクラスを使用してリモートマシンでプロセスを作成しようとしています。プロセスを作成することができます。しかし問題は、サービスの作成に時間がかかり、コンソールウィンドウが表示されることです。別の厄介なことは、コンソールウィンドウが私のウィンドウフォームの上に表示され、そのフォームで他の操作を実行できないことです。私のようなすべてのプロパティを設定していますCreateNoWindow = true

proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden

それでもコンソールウィンドウが表示されます。出力とエラーを別のストリームにリダイレクトしましたが、運はありませんでした。

コンソールウィンドウを非表示にする方法は他にありますか?私を助けてください 。

これは、scコマンドの実行に使用したコードの一部です。

Process proc = new Process();
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
proc.StartInfo.FileName = "sc";
proc.StartInfo.Arguments = string.Format(@"\\SYS25 create MySvc binPath= C:\mysvc.exe");
proc.StartInfo.RedirectStandardError = false;
proc.StartInfo.RedirectStandardOutput = false;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.CreateNoWindow = true;
proc.Start();
proc.WaitForExit();

設定してみましたproc.StartInfo.RedirectedStandardOutput = trueか?私はこれをWindowsアプリケーションで動作するようにしました。
ポイ

完全なソースコードサンプルが機能する最終的な解決策はありますか?
Kiquenet 2013

Windows コンソールアプリでは、UseShellExecuteを設定するだけで(リダイレクトなどはありません)うまくいきました。こちらをご覧ください
ポール

コンソールウィンドウがフォームを開いてロックアウトする限り、プロセスをタスクとして、または新しいスレッドで実行する必要があります
Ryan Dooley

なぜあなたは設定されているUseShellExecuteCreateNoWindow二回?
Mike Lowery

回答:


119

コンソールウィンドウを表示せずにプロセスを開始しようとすると、同様の問題が発生しました。プロパティ値のいくつかの異なる組み合わせを使用して、希望する動作を示す組み合わせが見つかるまでテストしました。

UseShellExecuteプロパティをfalseに設定する必要がある理由を詳しく説明したページを次に示します。
http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.createnowindow.aspx

ページの「備考」セクション:

UseShellExecuteプロパティがtrueの場合、またはUserNameプロパティとPasswordプロパティがnullでない場合、CreateNoWindowプロパティの値は無視され、新しいウィンドウが作成されます。

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = fullPath;
startInfo.Arguments = args;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;

Process processTemp = new Process();
processTemp.StartInfo = startInfo;
processTemp.EnableRaisingEvents = true;
try
{
    processTemp.Start();
}
catch (Exception e)
{
    throw;
}

2
さらに詳細を追加しますか?なぜこれがではなく動作します
アクア2013年

2
それは、標準出力がウィンドウの存在を強制しているためですか?
Denise Skidmore

1
そして、どうやら設定なしでは標準出力をリダイレクトできないstartInfo.UseShellExecute = false;
Denise Skidmore

1
この他の回答でUseShellExecute = trueを使用した理由は何ですか? stackoverflow.com/questions/2317767/c-process-start-hide
Denise Skidmore

9
とにかく再びスローしているだけの例外をキャッチする理由がわかりません。
Blindy、2015年

54

プロセス(Wix light.exe)が本質的に昼食に出かけ、夕食に間に合うように家に帰らないという、この答えには不運がありました。しかし、以下は私にとってはうまくいきました:

Process p = new Process();
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
// etc, then start process

2
私のために働きました-素晴らしくてシンプルです!
J c

2
これは本当に受け入れられる答えになるはずです。魅力のように機能します。
Eternal21 2014

2
CreateNoWindow = trueうまく
いき

3
これはウィンドウ付きのアプリケーションでのみ機能し、コンソールアプリケーションはウィンドウを表示します
Geograph

18

これはうまくいくはずです。


システム参照を追加します。

using System.Diagnostics;

次に、このコードを使用して、非表示のCMDウィンドウでコマンドを実行します。

Process cmd = new Process();
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
cmd.StartInfo.Arguments = "Enter your command here";
cmd.Start();

11

これはウィンドウを表示しません:

Process cmd = new Process();
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
cmd.StartInfo.CreateNoWindow = true;

...
cmd.Start();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.