2012-02-14 2 views
2

私は前提条件を必要とするwpfアプリケーションを作成しています。その前提条件が満たされていない場合は、ユーザに、前提条件をインストールするかどうか尋ねます:Microsoft Visual C++ 2010 SP1 Redistributable Packageサイレントプロセス/プログラムを実行

ユーザが前提条件をインストールすることを選択した場合、私はvcredist_x86.exe(これは私が提供した最初のリンクからダウンロードされるファイルです)を実行します。

その後、私のアプリケーション上で、私はインストールのようなものを実行して、完了したときに伝えることができるようになります:

ProcessStartInfo psi = new ProcessStartInfo(@"vcredist_x86.exe"); 
var p = new Process(); p.StartInfo = psi; 

p.Start(); //start the process 
p.WaitForExit(); // wait for the installation to finish 

// installation should be done now 

[OK]を、すべてがこれまでに素晴らしい作品。 問題は私のwpfアプリケーションにプログレスバーがあり、そこに進捗状況を示すことです。

私は、次の手順を実行して、インストールの進捗状況を示すことができた:

それは単純なタスクを自動化するための素晴らしいですAutoItと呼ばれるプログラムがあります。たとえば、次のようなものを使用してウィンドウがautoitで存在するかどうかを簡単に検出できます。enter image description here

次に、このスクリプトをコンパイルし、非常に小さな実行可能ファイルを作成することができました。 その実行可能ファイルでは、指定されたウィンドウが存在する場合は1を返します。そうでない場合はです。

ユーザーが次のウィンドウに移動すると、スクリプトが2と表示される可能性があります。そのウィンドウは別のウィンドウです。 AutoItはまた、ウィンドウの進行状況バーの進行状況を見ることができます!そのスクリプトが例えば80を返した場合、私は80%に進捗を更新します。

// start the autoitExecutable.... 

// wait for executable to exit usually takes 10 miliseconds it is fast 

if (autoitProcess.ExitCode == 1) 
{ 
    // do somthing 
}else if(autoitProcess.ExitCode == 2) 
{ 
    // do something else 
} //etc.... 

あなたは、私がそのスクリプトにWPFの私のプログレスバーを更新するために行われた変更を検出するために、1秒ごとに実行する必要が見ることができるように:

私のような何かをすることによってそれを行います。それは動作しますが、毎回私は私が得るのC#で実行可能なことを実行します。それが再び表示され、次の第二に、約500ミリ秒

enter image description here

カーソルを。窓が現れなくても迷惑になります。私はそのカーソルを取り除き、何とかその実行ファイルを静かに実行できるといいですね。私がautoit実行可能ファイルを実行すると、表示されるウィンドウも何も表示されません。

P.S.

私は、ウィンドウの存在を確認するためにC#を使用することができ、autoitと同様に他のウィンドウのハンドラの値を見ることができますが、AutoItでこれらのプログラムを作成するのは簡単です素敵な私はtaks

+0

これは、インストーラプロジェクト(前提条件チェック+インストール)で無料で提供されるもののための**多くの労力のようです。あなたのp.WaitForExit()上の – spender

+0

私はそれを行う方法があることを知っているWhileループを試してみましたか? – MethodMan

+0

別のスレッドでインストールをキックオフして、アニメーションを表示してください。 –

答えて

0

この種の代わりのC#のはAutoItを使用することができれば、私はこの

// Inside the form class: 

private System.Diagnostics.Process proc; 

private void myProcess_Exited(object sender, System.EventArgs e) 
{ 
    button3.BackColor=Color.LightGreen; //success indicator 
} 
のようなものをやってみたかった場合には、例えば、イベントの内部

System.Diagnostics.ProcessStartInfo p = new 
    System.Diagnostics.ProcessStartInfo(@"vcredist_x86.exe") ; 
p.Arguments="-RunForever"; 
proc = new System.Diagnostics.Process(); 
proc.StartInfo = p; 
proc.EnableRaisingEvents = true; 
proc.Exited += new EventHandler(myProcess_Exited); 
proc.Start(); 

のためだけでなく、イベントハンドラを追加することができます

あなたはしばらくの間、これをやってみたかった場合、ループ、あなたはまた、例えば のためにこのような何かを行うことができますが、あなたが

while(!autoitProcess.WaitForExit(someTimeout)) 
{ 
    if(ShouldCancel) 
    { 
     break; 
    } 
} 

はこれを行い利用することができ、あなたのケース サンプルコードに合わせてのparamsを変更する必要があります理にかなって、助けて...?

+0

のコードの最初のブロックにあります:proc.Start();プロセスは500ミリ秒かかる。私は常にproc.Start()を実行しています。 。私がproc.Start()を使うたびに。私はバスの事ではない400ミリ秒の間、円のカーソルを取得します。しかし、私はproc.Start()を実行しているので、 1秒ごとにサークルを取得します。私は自分自身を説明していることを願って –

1

exeが「コンソールアプリケーション」ではなく「Windowsアプリケーション」に設定されている場合、この現象が見られました。

コンソールにタイプを変更すると、起動時にビジーカーソルが表示されなくなりました。

関連する問題