C#学习笔记----.net操作进程
进程(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();
}
}
}
}

显示如下:
C#学习笔记----.net操作进程的更多相关文章
- MongoDB学习笔记:Python 操作MongoDB
MongoDB学习笔记:Python 操作MongoDB Pymongo 安装 安装pymongopip install pymongoPyMongo是驱动程序,使python程序能够使用Mong ...
- Javascript学习笔记二——操作DOM
Javascript学习笔记 DOM操作: 一.GetElementById() ID在HTML是唯一的,getElementById()可以定位唯一的一个DOM节点 二.querySelector( ...
- Javascript学习笔记三——操作DOM(二)
Javascript学习笔记 在我的上一个博客讲了对于DOM的基本操作内容,这篇继续巩固一下对于DOM的更新,插入和删除的操作. 对于HTML解析的DOM树来说,我们肯定会时不时对其进行一些更改,在原 ...
- Java学习笔记-基础语法Ⅹ-进程线程
学习快一个月了,现在学到了黑马Java教程的300集 打印流的特点: 只负责输出数据,不负责读取数据 有自己的特有方法 字节打印流:PrintStream,使用指定的文件名创建新的打印流 import ...
- python学习笔记:文件操作和集合(转)
转自:http://www.nnzhp.cn/article/16/ 这篇博客来说一下python对文件的操作. 对文件的操作分三步: 1.打开文件获取文件的句柄,句柄就理解为这个文件 2.通过文件句 ...
- MongoDB学习笔记——聚合操作之MapReduce
MapReduce MongoDB中的MapReduce相当于关系数据库中的group by.使用MapReduce要实现两个函数Map和Reduce函数.Map函数调用emit(key,value) ...
- PHP学习笔记--文件目录操作(文件上传实例)
文件操作是每个语言必须有的,不仅仅局限于PHP,这里我们就仅用PHP进行讲解 php的文件高级操作和文件上传实例我放在文章的最后部分.--以后我还会给大家写一个PHP类似于网盘操作的例子 注意:阅读此 ...
- 《Linux内核设计与实现》学习笔记之“Linux进程管理机制”
一.进程(或者称为“任务”)简介 进程是OS最基本的抽象之一,通常进程包括“可执行程序代码”,“其他资源”(如:打开的文件,挂起的信号,内核内部数据,处理器状态,地址空间,一个或多个执行线程等) 二. ...
- C++学习笔记39:进程概念
进程的基本概念 进程是描述程序执行过程和资源共享的基本单位 主要目的:控制和协调程序的执行 进程相关函数 用户与组ID函数 创建进程:system(),fork(),exec() 终止进程:kill( ...
随机推荐
- HLOI2016滚粗记
首先,别问我HLOI是哪里....HLJ = 黑龙江... 这次的省选总结起来还是由于我太弱,考试的时候状态不好,连个线段树都没想出来 坐了好久的火车到哈尔滨,车上打了一会扑克,感觉没过多长时间就到了 ...
- Jsoup Element网页信息采集
package zeze; import java.io.IOException; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; i ...
- svn: E155004 'XX' is already locked
Error:svn: E155004: Run 'svn cleanup' to remove locks (type 'svn help cleanup' for details)svn: E155 ...
- VRRP虚拟路由器冗余协议
VRRP(VirtualRouterRedundancyProtocol,虚拟路由冗余协议)是一种容错协议.通常,一个网络内的所有主机都设置一条缺省路由,这样,主机发出的目的地址不在本网段的报文将被通 ...
- Java程序优化的一些最佳实践(转)
衡量程序的标准 衡量一个程序是否优质,可以从多个角度进行分析.其中,最常见的衡量标准是程序的时间复杂度.空间复杂度,以及代码的可读性.可扩展性.针对程序的时间复杂度和空间复杂度,想要优化程序代码,需要 ...
- 左侧导航栏复制粘贴保存html即可
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- JQ引用
<script type="text/javascript" src="http://files.cnblogs.com/914556495wxkj/jquery- ...
- 用 get 同步/异步 方式获取网络数据并输出
//同步请求 //创建NSString用来存储请求的网址 NSString* str=@"http://v.juhe.cn/weather/index?format=2&cityna ...
- 【C语言】指针
错误一: 一种错误的写法: * sizeof(int)); * sizeof(int)); y = x; 没有必要为y开辟内存,因为y在开辟内存时 y内存储的地址时开辟的内存的位置, 但是后面又把x的 ...
- 用SSH登录局域网中使用网络设置为NAT的虚拟机中的linux
环境描述: A客户机,安装有putty软件使用SSH方式登录B主机中的虚拟机中的linux:A机的网络地址:192.168.1.2 B主机为Windows7平台,B主机的网络地址为:192.168.1 ...