静默执行进程/程序

时间:2012-02-14 22:09:02

标签: c# process autoit

我正在创建一个需要先决条件的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

的内容轻松检测是否存在autoit窗口

然后我可以编译该脚本并创建一个非常小的可执行文件。 在该可执行文件中,如果指定的窗口存在,我将返回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创建这些程序非常简单并且它会很好如果我可以使用AutoIt而不是C#来实现这种目标

2 个答案:

答案 0 :(得分:1)

当exe设置为" windows application"时,我看到了这种行为。而不是"控制台应用程序"。

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

答案 1 :(得分:0)

您也可以添加一个事件处理程序,例如

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;
   }
}

这有意义还是有帮助......?