2012-02-14 61 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应用程序”而不是“控制台应用程序”时,我看到了这种行为。

将类型更改为控制台不再会在启动时提供繁忙的光标。