C# 进程管理 Process的常用属性与方法
进程(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
二、信息传递
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();
}
}
}
}
显示如下:
合理关闭进程
private void MainWindow_Closed(object sender, EventArgs e){string processName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name; //获取当前进程名称try{Console.WriteLine(string.Format("关闭程序【{0}】", processName));this.ThreadRefresh.Abort(); //关闭线程this.Dispatcher.Invoke(new Action(() => {Application.Current.Shutdown();System.Diagnostics.Process.GetCurrentProcess().Kill();}));}catch (Exception){Environment.Exit(0); //强制关闭}}
C# 进程管理 Process的常用属性与方法相关推荐
- Node.js process 模块常用属性和方法
Node.js是常用的Javascript运行环境,本文和大家发分享的主要是Node.js中process 模块的常用属性和方法,希望通过本文的分享,对大家学习Node.js http://www.m ...
- vb中WindowsMediaPlayer的常用属性和方法
vb中WindowsMediaPlayer的常用属性和方法 enableContextMenu:Boolean 显示/不显示播放位置的右键菜单 fullScreen:boolean 全屏显示 stre ...
- iPone应用开发 UIView 常用属性和方法
程序开发-uiview常用属性和方法">iPone应用程序开发 UIView常用属性和方法 常用属性 alpha 视图的透明度0.0f - 1.0f backgroundColor 视 ...
- selenium提取数据之driver对象的常用属性和方法
selenium提取数据之driver对象的常用属性和方法 在使用selenium过程中,实例化driver对象后,driver对象有一些常用的属性和方法 driver.page_source 当前标 ...
- 尚硅谷学习笔记-节点的常用属性和方法
节点的常用属性和方法[图片在末尾] 方法: 通过具体的元素节点调用 getElementsByTagName() 方法,获取当前节点的指定标签名孩子节点 appendChild( oChildNode ...
- ExtJs window(一)使用API以及window常用属性和方法
1.使用API xtype:组件的别名 Hierarchy 层次结构 Inherited mixins 混入的类 Requires 该组件需要使用的类 configs:组件的配置信息 properti ...
- Ajax--概述、xhr对象的常用属性和方法、xhr的常用事件、xhr对象发送POST请求、xhr对象发送GET请求、xhr对象的兼容性问题、数据交换格式(XML、JSON)
一.概述 1.1 发展历程 在开始之前先来看一下Ajax的工作原理吧,如下图所示: Ajax全称Asynchronous javascript and xml(异步 JavaScript 和 XML) ...
- C# Windows Media Player 控件的常用属性及方法
C# Windows Media Player 控件的常用属性及方法 属性/方法名: 说明: URL:String; 指定媒体位置,本机或网络地址 uiMode:String; 播放器界面模式,可为F ...
- JavaScript之DOM常用属性及方法详解
一.什么是DOM? DOM:文档对象模型(Document Object Model,简称 DOM),是 W3C 组织推荐的处理可扩展标记语言(HTML或者XML)的标准编程接口. W3C 已经定义了 ...
最新文章
- 在线作图丨高级的微生物分析——在线做Variance Partitioning Analysis(VPA分析)
- Hibernate的关联关系映射
- Redis中的可用性保证之Sentinel的Ratf 算法
- 再看Kafka Lag
- 如何将HBuilder中的项目Push至Gitee中!
- 每日一题(31)—— 全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?
- java j2ssh替代jsch,jsch设置ssh协商算法优先级
- ubuntu下安装php openssl扩展
- 怎么取消打开文件的安全警告?
- 颠覆你的思维,探寻人类发展史
- 使用three.js的着色器通道一之渲染地球模型
- PostgreSQL 源码解读(31)- 查询语句#16(查询优化-表达式预处理#1)
- 高德地图API获取当前位置对应的周边信息
- 当今几大主流服务器的操作系统简介
- 什么是悲观锁和乐观锁,及分布式锁的实现方式
- centos 安装 pcre
- 自适应巡航控制系统——ACC
- 教育知识与能力简答题知识点
- 【JAVA】贪吃蛇的初步实现(五)
- DFX部署过程中mysql8版本操作改密码
热门文章
- 汽车电磁兼容(EMC)问题的研究
- 【Matlab人脸识别】KL变换人脸识别【含GUI源码 859期】
- 2015.03.10,学习,文献笔记-“水轮机压力脉动的混频幅值置信度分析方法研究” (1)...
- 用友金蝶 不同道路,殊途同归
- 恶心的QQ818网站
- 【数据压缩】调用VFW库对无压缩avi的解封装
- 魔域mysql修改_魔域数据库各表属性完整介绍
- 管理网站服务器地址,如何使用phpIPAM来管理IP地址和子网
- 文件共享-ftp、pure-ftpd、sftp共享
- mysql 大二进制类型_MySql 二进制类型