C# 进程类 Process
在程序开发中,一个程序经常需要去调用其他的程序,C#中Process类正好提供了这样的功能。它提供对本地和远程进程的访问并使您能够启动和停止本地系统进程。
Process.Start 方法,启动(或重用)此 Process 组件的 StartInfo 属性指定的进程资源,并将其与该组件关联。如果启动了进程资源,则为 true;如果没有启动新的进程资源(例如,如果重用了现有进程),则为 false。
Process.StartInfo 属性,获取或设置要传递给 Process 的 Start 方法的属性。StartInfo 表示用于启动进程的一组参数。 调用 Start 时,StartInfo 用于指定要启动的进程。 唯一必须设置的 StartInfo 成员是 FileName 属性。
ProcessStartInfo.FileName 属性,获取或设置要启动的应用程序或文档。FileName 属性不需要表示可执行文件。 它可以是其扩展名已经与系统上安装的应用程序关联的任何文件类型。
ProcessStartInfo.CreateNoWindow属性,获取或设置指示是否在新窗口中启动该进程的值。
Process.Kill 方法,立即停止关联的进程。Kill 强制终止进程,Kill 方法将异步执行。 在调用 Kill 方法后,请调用 WaitForExit 方法等待进程退出,或者检查 HasExited 属性以确定进程是否已经退出。
进程结束后调用其他方法:
在调用某个进程结束后,我们通常需要执行其他的方法,比如,在做安装程序时,需要先判断.Net Framework环境是否安装,若未安装,则先调用.NET Framework安装程序后,继续运行安装程序方法。 通常这种情况下,有两种方法:
方法一:WaitForExit()方法。这种方法会阻塞当前进程,直到运行的外部程序退出。
System.Diagnostics.Process exep = System.Diagnostics.Process.Start(@"C:\Windows\Notepad.exe"); exep.WaitForExit();//关键,等待外部程序退出后才能往下执行 MessageBox.Show("Notepad.exe运行完毕");
上述代码在Notepad.exe记事本结束之后,弹出对话框。
方法二:Exited 事件。为外部进程添加一个事件监视器,当退出后,获取通知,这种方法时不会阻塞当前进程,你可以处理其它事情。
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运行完毕"); }
在事件结束之后,调用Exited 事件方法。
对于在C#程序开发中调用外部程序的操作,要判断这个被调用的EXE文件是否执行结束其实最跟本的是 System.Diagnostics.Process类的应用,其中有一个方法,就是WaitForExit();和HasExited属性,这两个也 都是为判断外部程序exe文件的执行状态而设计的,HasExited=ture时表示执行结束.
小例子:
using System; using System.Diagnostics; using System.Windows.Forms; using System.IO; namespace 进程类 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { textBox1.Clear();//清空 文本框 Process[] pros= Process.GetProcesses();//获取当前所有进程 foreach (var item in pros)//循环 { textBox1.AppendText(item+"\r\n");//输出 } } private void button2_Click(object sender, EventArgs e) { Process[] pros= Process.GetProcesses();//获取当前所有进程 foreach (var item in pros)//循环 { item.Kill();//杀死进程 } } private void button3_Click(object sender, EventArgs e) { Process.Start("notepad");//打开记事本 } private void button4_Click(object sender, EventArgs e) { Process.Start("calc");//打开计算器 } private void button5_Click(object sender, EventArgs e) { Process.Start("mspaint");//打开画图 } private void button6_Click(object sender, EventArgs e) { Process.Start("Iexplore","http://www.daobk.com");//打开浏览器 } private void button7_Click(object sender, EventArgs e) { string path = textBox2.Text;//获取路径 if (File.Exists(path))//判断 文件是否存在 { ProcessStartInfo psi = new ProcessStartInfo(path);//指定启动进程时使用的诸如应用程序或文档的文件名。 Process p = new Process();//实例化 p.StartInfo = psi;//赋值 p.Start();//启动 } else { MessageBox.Show("要打开的文件不存在!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);//提示 } } } }
输出结果:
以上内容节选自《博客园》
其他详解参考《CSDN》