C# 加载进程后完成操作

C# 加载进程后完成操作,c#,.net,visual-studio-2010,C#,.net,Visual Studio 2010,问题是,在我工作的地方,我们有很多非常不懂电脑的人。我们有4个应用程序必须运行,以便这些家伙可以完成他们的工作。他们必须运行无线网卡,然后是Cisco VPN,VPN连接后,他们必须运行传输程序,然后是允许他们完成工单的移动应用程序 我的目标是通过让他们可以运行一个一步一步运行程序的应用程序来证明这一愚蠢的证明(或者尽我所能证明)。到目前为止,该程序只有4个按钮,步骤1-4。现在,它只加载可见的“步骤1”,当他们点击它时,它运行第一个程序,然后显示下一个按钮,还使当前按钮变为绿色,并显示程序已启

问题是,在我工作的地方,我们有很多非常不懂电脑的人。我们有4个应用程序必须运行,以便这些家伙可以完成他们的工作。他们必须运行无线网卡,然后是Cisco VPN,VPN连接后,他们必须运行传输程序,然后是允许他们完成工单的移动应用程序

我的目标是通过让他们可以运行一个一步一步运行程序的应用程序来证明这一愚蠢的证明(或者尽我所能证明)。到目前为止,该程序只有4个按钮,步骤1-4。现在,它只加载可见的“步骤1”,当他们点击它时,它运行第一个程序,然后显示下一个按钮,还使当前按钮变为绿色,并显示程序已启动的文本,还使其无法点击以阻止他们打开程序30次(因为他们会)

所有这些都很好,一个按钮接一个按钮。但我想做的是点击第1步(按钮标签“Step1”),然后在按钮中显示文本,上面写着“启动程序”,当程序启动时,它会将按钮更改为绿色背景,文本为“程序启动”,然后显示下一个按钮

以下是按钮的代码:

    private void Form1_Load(object sender, EventArgs e)
    {
        Rectangle workingArea = Screen.GetWorkingArea(this);
        this.Location = new Point(workingArea.Right - Size.Width, workingArea.Bottom - Size.Height);
        Step2.Visible = false;
        Step3.Visible = false;
        Step4.Visible = false;
    }

    private void Step1_Click(object sender, EventArgs e)
    {
        Step1.BackColor = Color.LightGreen;
        Step1.Text = "Verizon Wireless Card";
        string strVzWireless = "C:\\Program Files (x86)\\Verizon Wireless\\VZAccess Manager\\VZAccess Manager.exe";
        Process VzWireless = Process.Start(strVzWireless);
        Step2.Visible = true;
        Step1.Enabled = false;
    }

    private void Step2_Click(object sender, EventArgs e)
    {
        Step2.BackColor = Color.LightGreen;
        Step2.Text = "Cisco VPN Client";
        string strCisco = "C:\\Program Files (x86)\\Cisco\\Cisco AnyConnect VPN Client\\vpnui.exe";
        Process Cisco = Process.Start(strCisco);
        Step3.Visible = true;
        Step2.Enabled = false;
    }

    private void Step3_Click(object sender, EventArgs e)
    {
        Step3.BackColor = Color.LightGreen;
        Step3.Text = "Client Rf Transport";
        string strRfTransport = "C:\\MWM\\MobileStation\\RfTransport\\RfTransport.exe";
        Process RfTransport = Process.Start(strRfTransport);
        Step4.Visible = true;
        Step3.Enabled = false;
    }

    private void Step4_Click(object sender, EventArgs e)
    {
        Step4.BackColor = Color.LightGreen;
        Step4.Text = "Mobile Station";
        string strMobileStation = "C:\\MWM\\MobileStation\\Station.exe";
        Process MobileStation = Process.Start(strMobileStation);
        Step4.Enabled = false;
    }

有什么想法吗?我只希望按钮1根据正在运行的进程的状态更改颜色和文本,然后显示按钮2,依此类推。

一个选项是在后台线程上启动进程,然后使用等待,直到它启动并处于“就绪”状态。然后,您可以启动流程中的第二步,等等。

流程。WaitForInputIdle()
可能就是您要查找的内容—它将等待流程准备好接受消息,这通常是流程启动的一个良好指示器。()


尝试执行这样的程序的缺点是,如果在下一次启动之前,用户需要对每个应用程序进行非零量的工作,那么他们可能会快速连续地单击所有步骤,不执行任何配置,并奇怪为什么事情不起作用。您可能希望调查您正在使用的程序,看看它们是否可以自动化(可能通过命令行或配置文件),并免除用户的工作,这样它们就不会以不同的方式结束自己的工作。

我所见过的最好的开场白。Reed Copsey所说的(+1ed)或
Process.Start().WaitForExit()
@Sayse
WaitForExit()
可以工作,但会被阻止,因此您不会收到任何UI通知(可能没问题,但可能很糟糕)@ReedCopsey-啊,您的权利,我忽略了方法名称,并假设它是一个控制台应用程序。我编辑了您的标题。请参见“”,其中的共识是“不,他们不应该”。但使用
退出是否假定它会退出?在我看来,它正在启动其他继续运行的应用程序。那
Process.WaitForInputIdle()
呢?这似乎很合理,以前从未使用过,但似乎很有用。需要注意的一点是,控制台应用程序似乎会立即返回,其中一部分将用于下一个版本,这一个只需要查看进程是否正在运行,如果正在运行,让它们进入下一步。最后,它将检查卡是否有连接,下一步将确保vpn实际连接,等等,但现在我只需要确保程序实际运行。