在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
进程(Process)是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源。进程之间是相对独立的,一个进程无法直接访问另一个进程的数据(除非分布式),一个进程运行的失败也不会影响其他进程的运行,Windows系统就是利用进程把工作划分为多个独立的区域的。 进程可以理解为一个程序的基本边界。 在System.Diagnostics命名空间当中存在Process类,专门用于管理进程的开始、结束,访问进程中的模块,获取进程中的线程,设定进程的优先级别等。 Process类常用属性:
Process类常用方法:
Microsoft关于Process的说明:http://msdn.microsoft.com/zh-cn/library/system.diagnostics.process.aspx 二、信息传递StartInfo这个属性专门用于传递信息到被调用的程序。 其类型是:System.Diagnostics.ProcessStartInfo,MSDN地址为:http://msdn.microsoft.com/zh-cn/library/system.diagnostics.processstartinfo.aspx。 其属性也很多,无法一一详述。 为了展示其作用,我设计了两个控制台程序。 第一个控制台程序代码如下: static void Main(string[] args) { foreach(string arg in args) { Console.WriteLine(arg); } Console.ReadKey(); } 然后生成,然后将其生成的exe文件的路径作为参数,放在第二个控制台程序中。 static void Main(string[] args) { Process process = new Process(); process.StartInfo.FileName = @"C:\Users\ChenZhuo\Desktop\MyConsoleApplication\MyConsoleApplication\bin\Debug\MyConsoleApplication.exe"; process.StartInfo.Arguments = string.Format("姓名:刘备 年龄:26"); process.Start(); Console.ReadKey(); } 启动时输出如下:
可以看到StartInfo这个属性主要用于调用程序向被调用程序传递信息。 被调用程序的参数在Main(string[] args)这里接收,默认是通过空格分隔。 三、建立与销毁进程利用Start与Kill方法可以简单建立或者销毁进程,下面以一个例子:用Start方法启动记事本的进程,并打开File.txt文件。2秒钟以后使用Kill方法销毁进程并关闭记事本。然后又用google浏览器打开百度首页两秒后关闭。 public class Program { static void Main(string[] args) { //打开记事本 Process process = Process.Start("notepad.exe", "D:123.txt"); Thread.Sleep(2000); process.Kill(); //打开google浏览器,并打开百度 Process process2 = Process.Start("chrome.exe", "http://www.baidu.com"); Thread.Sleep(20000); process.Kill(); Console.ReadKey(); } } 显示如下:
四、显示计算机运行中的进程使用 GetProcesses 方法可以获取本地计算机上正在运行的每一个进程列表。而进程的 Id 属性是每个进程的唯一标志,通过下面的方法,可以显示当前计算机运行的所有进程信息。 public class Program { static void Main(string[] args) { var processList = Process.GetProcesses(); foreach (var process in processList) { Console.WriteLine(string.Format("ProcessId is:{0} \t ProcessName is:{1}", process.Id, process.ProcessName)); } Console.ReadKey(); } } 输出结果如下:
如果已经知道了进程的Id,就可以通过GetProcessId方法获取对应的进程: public class Program { static void Main(string[] args) { try { Process p = Process.GetProcessById(6888); Console.WriteLine(p.ProcessName); //输出 QQExternal } catch(Exception e) { Console.WriteLine(e.Message); } Console.ReadKey(); } } 同样地,你也可能通过GetProcessByName方法获取多个对应名称的进程: static void Main(string[] args) { Process[] pArr = Process.GetProcessesByName("QQExternal"); Console.WriteLine(pArr[0].Id); //输出 6888 Console.ReadKey(); } 注意:如果不能找到当前ID的进程,系统就会抛出ArgumentException异常。所以使用方法 GetProcessById 获取进程时应该包含在 try{...} catch{..} 之内。 五、获取进程中的多个模块Process类中有一个Modules属性,通过此属性可能获取进程中的多个模块。 这些模块可以是以*.dll结尾的程序集,也可以使*.exe结尾的可执行程序。 通过Process的GetCurrentProcess方法可以获取当前运行的进程信息,然后显示当前进程的多个模块信息。 class Program { static void Main(string[] args) { var modulelist = Process.GetCurrentProcess().Modules; foreach (ProcessModule pm in modulelist) { Console.WriteLine("模块名:" + pm.ModuleName + "文件名:" + pm.FileName + "版本号:" + pm.FileVersionInfo.FileVersion); } Console.ReadKey(); } } 输出结果如下:
六、综合示例,进程管理器Process用于管理计算机的进程,下面给出一个C#进程管理器的DEMO。 namespace ProcessManager { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { listView1.FullRowSelect = true; GetProcess(); } private void GetProcess() { listView1.Items.Clear(); Process[] proList = Process.GetProcesses(".");//获得本机的进程 lblNumber.Text = proList.Length.ToString(); //当前进程数量 foreach (Process p in proList) { ListViewItem lvi = new ListViewItem(); lvi.Text = p.ProcessName; lvi.SubItems.AddRange(new string[] { p.Id.ToString(), p.PrivateMemorySize64.ToString() }); //进程ID 使用内存 listView1.Items.Add(lvi); } } private void btnStop_Click(object sender, EventArgs e) { if (listView1.SelectedItems.Count > 0) { try { string proName = listView1.SelectedItems[0].Text; Process[] p = Process.GetProcessesByName(proName); //根据进程命获得指定的进程 p[0].Kill(); //杀死该进程 MessageBox.Show("进程关闭成功!"); GetProcess(); } catch { MessageBox.Show("无法关闭此进程!"); } } else { MessageBox.Show("请选择要终止的进程!"); } } private void btnStart_Click(object sender, EventArgs e) { if (txtProcess.Text != string.Empty) { Process.Start(txtProcess.Text); //启动一个进程 } else { MessageBox.Show("请输入启动项"); txtProcess.Focus(); } } } } 显示如下:
|
请发表评论