进程(Process)是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源。进程之间是相对独立的,一个进程无法直接访问另一个进程的数据(除非分布式),一个进程运行的失败也不会影响其他进程的运行,Windows系统就是利用进程把工作划分为多个独立的区域的。
进程可以理解为一个程序的基本边界。
一、Process的常用属性与方法
在System.Diagnostics命名空间当中存在Process类,专门用于管理进程的开始、结束,访问进程中的模块,获取进程中的线程,设定进程的优先级别等。
Process类常用属性:
属性 | 说明 |
BasePriority | 获取关联进程的基本优先级。 |
ExitCode | 获取关联进程终止时指定的值。 |
ExitTime | 获取关联进程退出的时间。 |
Handle | 返回关联进程的本机句柄。 |
HandleCount | 获取由进程打开的句柄数。 |
HasExited | 获取指示关联进程是否已终止的值。 |
Id | 获取关联进程的唯一标识符。 |
MachineName | 获取关联进程正在其上运行的计算机的名称。 |
MainModule | 获取关联进程的主模块。 |
Modules | 获取已由关联进程加载的模块。 |
PriorityClass | 获取或设置关联进程的总体优先级类别。 |
ProcessName | 获取该进程的名称。 |
StartInfo | 获取或设置要传递给Process的Start方法的属性。 |
StartTime | 获取关联进程启动的时间。 |
SynchronizingObject | 获取或设置用于封送由于进程退出事件而发出的事件处理程序调用的对象。 |
Threads | 获取在关联进程中运行的一组线程 |
Process类常用方法:
方法 | 说明 |
GetProcessById | 创建新的 Process 组件,并将其与您指定的现有进程资源关联。 |
GetProcessByName | 创建多个新的 Process 组件,并将其与您指定的现有进程资源关联。 |
GetCurrentProcess | 获取新的 Process 组件并将其与当前活动的进程关联。 |
GetProcesses | 获取本地计算机上正在运行的每一个进程列表。 |
Start | 启动一个进程。 |
Kill | 立即停止关联的进程。 |
Close | 释放与此组件关联的所有资源。 |
WaitForExit | 指示 Process 组件无限期地等待关联进程退出。 |
Microsoft关于Process的说明:http://msdn.microsoft.com/zh-cn/library/system.diagnostics.process.aspx
二、建立与销毁进程
利用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} 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(); } }
输出结果如下: