之前讲解了如何利用 VB.net / C# 打开外部程序,顺便提到了 shell 与 Process.Start 的区别,那么如果我们想监控程序一直到程序进程被关闭,那么我们只能用 Process.Start 来打开程序。因为 Process 给了我们更多的参数来进行追踪,比如PID。

VB代码

1
2
3
4
5
6
7
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Dim proc As New Process
        proc.StartInfo.FileName = "notepad.exe"
        proc.Start()
        proc.WaitForExit()
        MsgBox("文档已经关闭")
    End Sub

C#代码

方法一:利用 WaitForExit 函数等待进程结束
这种方法会阻塞当前进程,直到运行的外部程序退出

1
2
3
4
5
6
7
8
9
        private void button1_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Process exep = new System.Diagnostics.Process();  
            exep.StartInfo.FileName = @"C:\Windows\notepad.exe";  
            exep.Start();
            exep.WaitForExit();
            MessageBox.Show("Notepad.exe运行完毕");  
       
        }

方法二:为外部进程添加一个事件监视器,当退出后,获取通知,这种方法时不会阻塞当前进程,你可以处理其它事情

1
2
3
4
5
6
7
8
9
10
11
12
13
        private void button1_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Process exep = new System.Diagnostics.Process();
            exep.StartInfo.FileName = @"C:\Windows\Notepad.exe";
            exep.EnableRaisingEvents = true;
            exep.Exited += new EventHandler(exep_Exited);
            exep.Start();
        }

        void exep_Exited(object sender, EventArgs e)
        {
        MessageBox.Show("Notepad.exe运行完毕");
        }

对于在C#程序开发中调用外部程序的操作,要判断这个被调用的EXE文件是否执行结束其实最跟本的是 System.Diagnostics.Process类的应用,其中有一个方法,就是WaitForExit();和HasExited属性,这两个也都是为判断外部程序exe文件的执行状态而设计的,HasExited=ture时表示执行结束.