voodooq

如果人类少一些私欲,世界将多一些安详……

博客园 首页 新随笔 联系 订阅 管理
作者:深蓝色系统

本文内容下载(59KB)

本文将以一个简单的例子来说明如何使用C#获得当前处于激活状态的进程并读取某个特定ID 进程的基本信息。
现在有很多软件都具有读取系统进程的功能,比较著名的是Customizer XP,它是一个用来设置Windows XP 系统各种设置的软件。这个软件其中有一个功能就是能够打开或关闭系统运行时加载的程序。当然,本文没有做到Customizer XP 那么美观和细化的程度,但是我想只要知道了基本的方法,制作这样的功能是很简单的。
这个例子使用了.NET Framework 的Process 类来获得激活进程的信息,给出了当前激活进程的列表,并且能够显示某一个进程的一些基本信息。

制作过程

一、运行Visual Studio.NET,新建Visual C#.NET 工程,这里取名为ProcessInfo。
二、在解决方案资源管理器中, 将Form1.cs 改名为frmProcessInfo.cs(此项为可选)。
三、将Form1 的Text 属性改为Process Information,Font 改为Verdana,9pt(此项为可选)。
四、在窗体上添加三个控件:两个按钮和一个TextBox。对控件的属性进行修改,如下:
控件 Name属性 Text属性
Button1 btnGetProcessList 点击这里获得当前激活进程列表
Button 2 btnGetProcessByID 获得指定ID 的进程信息:
TextBox txtProcessID N/A
调整各控件的位置,此时用户界面类似于下图:

五、进入frmProcessInfo.cs 代码编辑器。在文件头部添加以下一行代码:
    using System.Diagnostics;
【注】System.Diagnostics 命名空间提供特定的类,使您能够与系统进程、事件日志和性能计数器进行交互。

六、在frmProcessInfo.cs[设计]中双击btnGetProcessList 按钮。系统自动添加btnGetProcessList_Click 事件。填写以下代码到btnGetProcessList_Click 事件中:
    string str = "";
    Process[] processes;
    //Get the list of current active processes.
    processes = System.Diagnostics.Process.GetProcesses();
    //Grab some basic information for each process.
    Process process;
    for(int i = 0;i<processes.Length-1;i++)
    {
    process = processes[i];
    str = str + Convert.ToString(process.Id) + " : " +
    process.ProcessName + "\r\n";
    }
    //Display the process information to the user
    System.Windows.Forms.MessageBox.Show(str);
    //Default the TextBox value to the first process ID - for the GetByID button
    txtProcessID.Text = processes[0].Id.ToString();
【注】 Process 组件提供对正在计算机上运行的进程的访问。用最简短的话来说,进程就是当前运行的应用程序。线程是操作系统向其分配处理器时间的基本单位。线程可执行进程的任何一部分代码,包括当前由另一线程执行的部分。
对于启动、停止、控制和监视应用程序等任务,Process 组件是很有用的工具。使用Process 组件,可以获取当前运行的进程的列表,或者启动新的进程。Process 组件用于访问系统进程。初始化Process 组件后,可使用该组件来获取有关当前运行的进程的信息。此类信息包括线程集、加载的模块(.dll 和.exe 文件)和性能信息(如进程当前使用的内存量)。
系统进程在系统上由其进程标识符唯一标识。与许多Windows 资源一样,进程也由其句柄标识,而句柄在计算机上可能不唯一。句柄是表示资源标识符的一般术语。即使进程已退出,操作系统仍保持进程句柄,该句柄通过Process 组件的Handle 属性访问。因此,可以获取进程的管理信息,如ExitCode(通常,或者为零表示成功,或者为非零错误代码)和ExitTime。句柄是非常有价值的资源,所以句柄泄漏比内存泄漏危害更大。


七、回到frmProcessInfo.cs[设计]页,双击btnGetProcessByID 按钮,则IDE自动添加btnGetProcessByID_Click事件在frmProcessInfo.cs
里。在btnGetProcessByID_Click 事件中,填写以下代码:
    try
    {
      string s = "";
      System.Int32 processid;
      Process process;
      //Retrieve the additional information about a specific process
      processid = Int32.Parse(txtProcessID.Text);
      process = System.Diagnostics.Process.GetProcessById(processid);
      s = s + "该进程的总体优先级类别:" + Convert.ToString(process.PriorityClass) + " \r\n";
      s = s + "由该进程打开的句柄数:" + process.HandleCount + "\r\n";
      s = s + "该进程的主窗口标题:" + process.MainWindowTitle + "\r\n";
      s = s + " 该进程允许的最小工作集大小:" + process.MinWorkingSet.ToString() + " \r\n";
      s = s + "该进程允许的最大工作集大小:" + process.MaxWorkingSet.ToString() + " \r\n";
      s = s + "该进程的分页内存大小:" + process.PagedMemorySize + "\r\n";
      s = s + "该进程的峰值分页内存大小:" + process.PeakPagedMemorySize + "\r\n";
      System.Windows.Forms.MessageBox.Show(s);
    }
    catch
    {
    System.Windows.Forms.MessageBox.Show("不合法的进程ID!");
    }
【注】Int32 值类型表示值介于-2,147,483,648 到+2,147,483,647 之间的有符号整数。
Int32 提供了一些方法,来比较该类型的实例、将实例的值转换为它的String 表示形式以及将数字的String 表示形式转换为该类型的实例。
有关格式规范代码如何控制值类型的String 表示形式的信息,请参阅格式设置概述。
此类型实现接口IComparable、IFormattable 和IConvertible。使用Convert 类进行转换,而不是使用此类型的IConvertible 显式接口成员实现。


八、主要代码我们已经填写完毕。下面使用菜单“生成”>“生成解决方案”命令后,按F5 即可测试程序了。

以下为当前进程列表以及某一个特定ID 进程的基本信息抓图:
值得一提的是,Process 类具有很多成员变量,这些成员变量可以获得进程的几乎每一个细节。上面的例子中只是简单地选择了几个成员加以演示。如果开发中有需要,可以参考MSDN Library,查询Process类成员以获得更详细的信息,这里就不一一列出了。

以上通过一个简单的例子来说明如何使用.NET Framework 和C#的Process 类来获得进程的信息。通过这个例子我们可以看出,C#提供给我们强大和便捷的Process 类,使我们的开发更容易、更方便。这对于编写高效、快速开发应用程序是非常有帮助的。
希望能有更多的朋友提供更好的意见和建议,也欢迎大家分享更多的开发、学习经验。

E-mail:xuyu@transtar.com.cn
Homepage:http://www.epubcn.com
Forum:http://www.epubcn.net
posted on 2004-06-16 11:47  Voodoo's天空  阅读(16803)  评论(0编辑  收藏  举报