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();
            }
        }
    }
}

  显示如下:

  

时间: 2024-11-05 18:27:57

C#学习笔记----.net操作进程的相关文章

计算机操作系统学习笔记_1_操作系统概述

操作系统概述 一.操作系统的概念.特征.功能和提供的服务 1.操作系统的概念     操作系统是计算机系统中最重要.最基本的系统软件,操作系统位于硬件和用户程序之间.    对于用户来讲:它能向用户提供使用计算机的接口;    从资源管理角度来看:它能管理计算机软硬件资源,提高其利用率;    再者,利用虚拟机技术(如WMWare,VirtualBox,Java虚拟机等),扩展了计算机的功能和使用范围.     因此,操作系统的定义为:操作系统是控制和管理计算机软.硬件资源,以尽可能合理.高效的

Linux程序设计学习笔记----System V进程通信(共享内存)

转载请注明出处:http://blog.csdn.net/suool/article/details/38515863 共享内存可以被描述成内存一个区域(段)的映射,这个区域可以被更多的进程所共享.这是IPC机制中最快的一种形式,因为它不需要中间环节,而是把信息直接从一个内存段映射到调用进程的地址空间. 一个段可以直接由一个进程创建,随后,可以有任意多的进程对其读和写.但是,一旦内存被共享之后,对共享内存的访问同步需要由其他 IPC 机制,例如信号量来实现.象所有的System V IPC 对象

Linux程序设计学习笔记----System V进程通信之消息队列

一个或多个进程可向消息队列写入消息,而一个或多个进程可从消息队列中读取消息,这种进程间通讯机制通常使用在客户/服务器模型中,客户向服务器发送请求消息,服务器读取消息并执行相应请求.在许多微内核结构的操作系统中,内核和各组件之间的基本通讯方式就是消息队列.例如,在 MINIX 操作系统中,内核.I/O 任务.服务器进程和用户进程之间就是通过消息队列实现通讯的. Linux中的消息可以被描述成在内核地址空间的一个内部链表,每一个消息队列由一个IPC的标识号唯一的标识.Linux 为系统中所有的消息队

Blender学习笔记 | 02 | 操作

Shift 点击不同图层 同时显示多图层物件 z 切换 Solid / Wireframe 视图模式 点选物件后M 移动到图层选项 Ctrl + 鼠标左键拖动 自由全选物件 B 方形区域圈选物件 Tab Object / Edit Mode 切换 T 开 / 关 侧栏 Ctrl + Tab 编辑状态下切换编辑对象 E Extrude Region 推挤区域.以发现为轴线. X 删除物件菜单 Blender学习笔记 | 02 | 操作,布布扣,bubuko.com

memcached学习笔记5--socke操作memcached 缓存系统

使用条件:当我们没有权限或者不能使用服务器的时候,我们需要用socket操作memcached memcached-client操作 特点: 无需开启memcache扩展 使用fsocketopen()套接字连接memcached 同样执行CRUD require_once(CLASS_PATH.'memcached-client.php');//CLASS_PATH 是我定义的类文件文件夹路径 $mc = new memcached( array( 'servers' => array( '1

树莓派学习笔记——SQLite操作简述

0 前言 本文介绍如何在树莓派中利用SQLite数据库保存CPU温度数据.SQLite是一款轻量级零配置数据库,非常适合在树莓派和其他嵌入式系统中使用.SQLite文档详细资料丰富,本文不会详细解释SQLite数据库操作的方方面面,只能结合具体场景按需说明.本文介绍的SQLite技巧也可以在其他平台使用,并不局限于树莓派. 本文继续折腾树莓派温度,需要从中可以玩出新花样. [相关博文] [树莓派学习笔记--索引博文]--更多博文请关注. [树莓派学习笔记--获取树莓派CPU温度] [树莓派学习笔

memcached学习笔记3--telnet操作memcached

方式: 一.telnet访问memcached缓存系统(主要用于教学,不讨论) telnet 127.0.0.1 11211     => telnet IP地址 端口号 //往Memcached中存放数据 add username 0 60 5       => add:添加命令 username:key的名字(是以key/value存放) 0:标示,一般不用管 60:缓存多长时间,超过时间自动删除,单位(秒) s 5: 表示放入的数据大小 注意:如果一个key已经存在,再要添加数据到这个k

PHP学习笔记-文件操作1

转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/52294237 本文出自:[顾林海的博客] 前言 PHP支持文件上传功能,因此学习PHP文件的相关操作是必须的,这篇笔记会去记录PHP文件系统的相关知识. 文件打开与关闭 文件处理包括读取.关闭.重写等,例如,访问一个文件需要3步:打开文件.读写文件和关闭文件.其他的操作要么是包含在读写文件中(如显示内容.写入内容等),要么与文件自身的属性有关系(如文件遍历.文件改名等

​【安全牛学习笔记】操作系统识别

该笔记为安全牛课堂学员笔记,想看此课程或者信息安全类干货可以移步到安全牛课堂 Security+认证为什么是互联网+时代最火爆的认证? 牛妹先给大家介绍一下Security+ Security+ 认证是一种中立第三方认证,其发证机构为美国计算机行业协会CompTIA :是和CISSP.ITIL 等共同包含在内的国际 IT 业 10 大热门认证之一,和CISSP偏重信息安全管理相比,Security+ 认证更偏重信息安全技术和操作. 通过该认证证明了您具备网络安全,合规性和操作安全,威胁和漏洞,应