2012-02-14 49 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 

好一切的偉大工程至今。 問題是我在我的wpf應用程序中有一個進度條,我希望在那裏顯示進度。

我已經能夠這樣做,顯示安裝進度如下:

有一個名爲AutoIt,這是偉大的,簡單的自動化任務的程序。例如,我可以很容易地通過使用類似的東西檢測窗口是否存在自動存儲:enter image description here

然後,我可以編譯該腳本並創建一個非常小的可執行文件。 在該可執行文件中,如果指定的窗口存在,則返回1,否則返回0。

當用戶移動到下一個窗口時,我的腳本可能會返回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.... 

正如你可以看到我有執行該腳本每隔1秒,以檢測哪些變化,以更新WPF我的進度條已經完成。這一工程,但我每次執行該可執行文件用C#我得到:

enter image description here

光標約500毫秒然後在其上再次出現下一秒。即使沒有窗戶出現,這變得令人討厭。如果我能擺脫那個遊標並以某種方式默默執行那個可執行文件,那將會很好。當我執行autoit可執行文件時,沒有窗口顯示,也沒有別的。

P.S.

我知道我可以使用c#來檢查窗口的存在,也許看到其他窗口的處理程序的值就像autoit能夠做到這一點,但它是如此簡單,使用AutoIt創建這些程序,它會是如果漂亮,我可以爲這種TAKS

+0

對於安裝程序項目(prereq檢查+安裝)免費提供的東西,這看起來像是一大堆努力工作。 – spender 2012-02-14 22:14:48

+0

在你的p.WaitForExit()我知道有一種方法可以在While循環中做到這一點你試過..? – MethodMan 2012-02-14 22:16:20

+0

在另一個線程中將安裝關閉,並在顯示動畫時顯示。僞進度條,加侖.. – 2012-02-14 22:20:39

回答

0

的使用,而不是C#的AutoIt你可以添加一個事件處理程序,以及例如

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

的事件中,如果我想要做這樣的事情

// Inside the form class: 

private System.Diagnostics.Process proc; 

private void myProcess_Exited(object sender, System.EventArgs e) 
{ 
    button3.BackColor=Color.LightGreen; //success indicator 
} 

,如果你想這樣做在一個while循環,你也可以做這樣的事情,例如 但你必須改變PARAMS適合你的情況 示例代碼,你可以利用

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

做到這一點理智或幫忙...?

+0

:proc.Start();該過程需要500毫秒才能執行。我經常運行proc.Start(); 。每次我使用proc.Start();我得到400毫秒的圓形光標,這不是洗澡的事情。但是因爲我正在運行proc.Start();每秒鐘我都會每秒鐘收到一個圈子。希望我解釋我的自我 – 2012-02-14 22:34:36

1

當exe被設置爲「windows應用程序」而不是「控制檯應用程序」時,我看到了這種行爲。

將類型更改爲控制檯不再會在啓動時提供繁忙的光標。