15.1 Process(进程)类

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

通常开发时想要获得进程是比较困难的事,必须要调用CreateToolhelpSnapshot、ProcessFirst、ProcessNext等API或者诸如 ZwQueryVirtualMemory这样的API,是非常繁琐的事。而在C#中,使用Process类就可以获得系统中运行的进程信息。Process类是在System.Diagnostics命名空间下,使用时可以先加入:

using System.Diagnostics;

【例 15.1【项目:code15-001】枚举计算机中的进程。

        private void button1_Click(object sender, EventArgs e)

        {

            listBox1.Items.Clear();

            foreach (Process pro in Process.GetProcesses())

                listBox1.Items.Add(pro.ProcessName);

     }

使用Process类一个循环就可以完成对进程的枚举。运行结果如下图所示:

图15-1 枚举计算机中的进程

Process常用属性:

  1. Id:获取进程的唯一标识符。
  2. MainModule:获取进程的主模块。
  3. MainWindowTitle:获取进程的主窗口标题。注意:只有当进程具有图形界面的情况下,才有与之关联的主窗口。
  4. MainWindowHandle:获取进程主窗口的窗口句柄。
  5. Modules:获取已由进程加载的模块。
  6. ProcessName:获取该进程的名称。
  7. StartInfo:要传递给 Process 的 Start 方法的属性。
  8. StartTime:获取进程启动的时间。
  9. HasExited         :指示进程是否已终止。
  10. ExitTime:进程退出的时间。注意:只有进程退出后才能调用此属性,否则会产生错误,请先用HasExited属性判断进程是否已经终止。
  11. Threads:获取在进程中运行的一组线程。
  12. PriorityClass:进程的总体优先级类别。
  13. BasePriority:获取进程的基本优先级。
  14. EnableRaisingEvents:在进程终止时是否应引发 Exited 事件。
  15. MachineName:获取进程正在其上运行的计算机的名称。
  16. NonpagedSystemMemorySize64:获取为进程分配的非分页系统内存量。
  17. PagedMemorySize64:获取为进程分配的分页内存量。
  18. PagedSystemMemorySize64:获取为进程分配的可分页系统内存量。
  19. PeakPagedMemorySize64:获取进程使用的虚拟内存分页文件中的最大内存量。
  20. PeakVirtualMemorySize64:获取进程使用的最大虚拟内存量。
  21. PeakWorkingSet64:获取进程使用的最大物理内存量。
  22. PriorityBoostEnabled:指示主窗口拥有焦点时是否应由操作系统暂时提升关联进程优先级。
  23. PrivateMemorySize64:获取为进程分配的专用内存量。
  24. PrivilegedProcessorTime:获取进程的特权处理器时间。
  25. Responding:获取指示进程的用户界面当前是否响应的值。
  26. TotalProcessorTime:获取进程的总的处理器时间。
  27. UserProcessorTime:获取进程的用户处理器时间。
  28. VirtualMemorySize64:获取为进程分配的虚拟内存量。
  29. WorkingSet64:获取为进程分配的物理内存量。

Process常用方法:

  1. Start:启动进程资源。通常情况下,参数可以直接传递文件路径或网址的字符串,进程会调用关联的程序打开参数指定的文件或网址。例如:

默认程序(通常是记事本)打开文本文件:

Process.Start("C:\\lessons\\将进酒.txt");

或者默认浏览器打开网址:

Process.Start("http://www.csdn.net");

  1. Kill:强制终止进程。注意:不建议使用此方法终止进程,因为此方法会导致进程立即终止,导致进程不能处理退出前的必要工作(比如有些程序会在退出前保存当前设置),导致进程异常终止。通常情况下应使用CloseMainWindow来结束进程。
  2. GetProcesses:创建新的 Process 组件的数组,并将它们与现有进程资源关联。
  3. GetProcessesByName:创建新的 Process 组件的数组,并将它们与共享指定的进程名称的所有现有进程资源关联。
  4. Process.GetProcessById:创建新的 Process 组件,并将其与您指定的现有进程资源关联。
  5. GetCurrentProcess:获取新的 Process 组件并将其与当前活动的进程关联。
  6. Close:释放与此组件关联的所有资源。
  7. CloseMainWindow:通过向进程的主窗口发送关闭消息来关闭拥有用户界面的进程。

15.1.1 获得进程信息

获得进程信息先是通过GetProcesses方法获得所有的进程,然后使用GetProcessById方法获得Process实例,然后获得Process的属性

【例 15.2【项目:code15-002】获得进程详细信息。

在窗体上防止一个Button控件、一个ListView控件、TextBox控件。

ListView控件用于显示当前系统中的进程,TextBox控件用于显示进程对应的信息。

具体代码如下:

        //将系统中的进程及对应Id显示于ListView1中

        private void button1_Click(object sender, EventArgs e)

        {

            listView1.Items.Clear();

            foreach(Process pro in Process.GetProcesses())

            {

                ListViewItem lvPro = new ListViewItem(pro.ProcessName);

                lvPro.SubItems.Add(pro.Id.ToString());

                listView1.Items.Add(lvPro);

            }

        }

        //单击listView1中的项时,显示进程相关信息

        private void listView1_SelectedIndexChanged(object sender, EventArgs e)

        {

            if (listView1.SelectedItems.Count != 1)

                return;

            ListViewItem lvpro = new ListViewItem();

            lvpro = listView1.SelectedItems[0];

            int proid = int.Parse(lvpro.SubItems[1].Text);

            //由于进程Id是唯一标识,所以使用GetProcessById来获得进程

            Process pro = Process.GetProcessById(proid);

            string proinfo = "";

            //进程相关信息:Process类相关属性

            proinfo += "进程的名称:" + pro.ProcessName + "\r\n";

            proinfo += "物理内存量:" + pro.WorkingSet64 + "\r\n";

            proinfo += "最大物理内存:" + pro.PeakWorkingSet64 + "\r\n";

            proinfo += "虚拟内存量:" + pro.VirtualMemorySize64 + "\r\n";

            proinfo += "最大虚拟内存:" + pro.PeakVirtualMemorySize64 + "\r\n";

            proinfo += "优先级:" + pro.BasePriority + "\r\n";

            try

            {

                proinfo += "进程启动的时间:" + pro.StartTime.ToString("yyyy-MM-dd HH:mm:ss") + "\r\n";

            }

            catch (Exception ex)

            {

                proinfo += "进程启动的时间:-" + "\r\n";

            }

            try

            {

                proinfo += "总的处理器时间:" + pro.TotalProcessorTime.ToString() + "\r\n";

            }

            catch (Exception ex)

            {

                proinfo += "总的处理器时间:-" + "\r\n";

            }

            try

            {

                proinfo += "总的处理器时间:" + pro.TotalProcessorTime.ToString() + "\r\n";

            }

            catch (Exception ex)

            {

                proinfo += "总的处理器时间:-" + "\r\n";

            }

                    proinfo += "主窗口句柄:" + pro.MainWindowHandle.ToString() + "\r\n";

            try

            {

                proinfo += "主窗口标题:" + pro.MainWindowTitle + "\r\n";

            }

            catch (Exception ex)

            {

                proinfo += "主窗口标题:-" + "\r\n";

            }

            textBox1.Text = proinfo;

        }

为了防止出错,在代码中加入了try...catch语句。造成错误的原因和如何解决错误,请看第15.2节。

运行结果如下图所示:

图15-2 计算机进程及相关信息

15.1.2 进程加载的模块

进程加载的模块是加载到特定进程的.dll或.exe文件,每个进程包含一个或多个模块,为进程提供不同的功能。

获得进程加载的模块主要使用到了Process类的MainModule和Modules属性。MainModule就是一个ProcessModule类,而Process.Modules是包含了多个ProcessModule类的数组(ProcessModuleCollection)。ProcessModule类允许查看相关模块,包括模块名称、对应文件名和内存等详细信息。

ProcessModule常用属性:

  1. BaseAddress:加载模块的内存地址。
  2. FileName:模块的完整路径。
  3. FileVersionInfo:获取模块的版本信息。
  4. ModuleMemorySize:获取加载模块所需内存大小。
  5. ModuleName:获取模块的名称。

【例 15.3【项目:code15-003】获得进程加载模块信息。

请在【例 15.2】基础上增加一个ListView2控件。当在ListView1中选中一个进程的时候,同时获得记载的模块信息。具体代码如下:

        private void listView1_SelectedIndexChanged(object sender, EventArgs e)

    {

                    ……

            textBox1.Text = proinfo;

            listView2.Items.Clear();

            ProcessModule mainMod=null;

            ListViewItem lvMod;

            //增加主模块的信息

            try

            {

                mainMod = pro.MainModule;

                //模块名称

                lvMod = new ListViewItem(mainMod.ModuleName);

                //内存地址

                lvMod.SubItems.Add(mainMod.BaseAddress.ToString()); //不能用ToInt32

                                                                 //版本信息

                lvMod.SubItems.Add(mainMod.FileVersionInfo.FileVersion);

                //内存大小

                lvMod.SubItems.Add(mainMod.ModuleMemorySize.ToString());

                //完整路径

                lvMod.SubItems.Add(mainMod.FileName);

                listView2.Items.Add(lvMod);

            }

            catch (Exception ex)

            {

                //不处理错误

            }

            try

            {

                foreach(ProcessModule proMod in pro.Modules)

                {

                    //注意:主模块也在Modules里面,必须要排除开。

                    if ((proMod.ModuleName == mainMod.ModuleName) && (proMod.BaseAddress == mainMod.BaseAddress))

                        continue;

                    lvMod =new ListViewItem(proMod.ModuleName);

                    lvMod.SubItems.Add(proMod.BaseAddress.ToString());

                    lvMod.SubItems.Add(proMod.FileVersionInfo.FileVersion);

                    lvMod.SubItems.Add(proMod.ModuleMemorySize.ToString());

                    lvMod.SubItems.Add(proMod.FileName);

                    listView2.Items.Add(lvMod);

                }

            }

            catch (Exception ex)

            {

                //不处理错误

            }

         }

注意:代码先是在listview2中列出了主模块的信息,由于Modules属性将会再次获得主模块,所以加了一句判断模块名称是否与主模块名称一致,如果一致就不再列出。

运行结果如下图所示:

图15-3 获取进程相关信息和相关模块

发生错误,因为默认编译为32位程序,无法访问64位进程的模块,请参看第13.3节,修改成编译为64位程序后,运行结果如下图所示:

图15-4 获取进程相关信息和相关模块

学习更多vb.net知识,请参看vb.net 教程 目录

学习更多C#知识,请参看C#教程 目录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/18975.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【全栈开发】----Mysql基本配置与使用

本篇是在已下载Mysql的情况下进行的,若还未下载或未创建Mysql服务,请转到这篇: 2024 年 MySQL 8.0.40 安装配置、Workbench汉化教程最简易(保姆级)_mysql8.0.40下载安装教程-CSDN博客 本文对于mysql的操作均使用控制台sql原生代码…

数据恢复-01-机械硬盘的物理与逻辑结构

磁盘存储原理 磁盘存储数据的原理: 磁盘存储数据的原理是利用磁性材料在磁场作用下的磁化性质,通过在磁盘表面上划分成许多小区域,根据不同的磁化方向来表示0和1的二进制数据,通过读写磁头在磁盘上的移动,可以实现数据…

神经网络新手入门(3)光明顶复出(2006-2012)

让我们继续这场科技江湖的传奇,见证神经网络如何从寒冬中涅槃重生: 第五章:光明顶复出(2006-2012) 2006年,江湖人称"深度学习教主"的辛顿(Geoffrey Hinton)闭关修炼二十…

【C++】基础入门(详解)

🌟 Hello,我是egoist2023! 🌍 种一棵树最好是十年前,其次是现在! 目录 输入&输出 缺省参数(默认参数) 函数重载 引用 概念及定义 特性及使用 const引用 与指针的关系 内联inline和nullptr in…

【2025最新版】软件测试面试题总结(150道题含答案解析)

接口测试面试题 1:你平常做接口测试的过程中发现过哪些 bug? 2:平常你是怎么测试接口的? 3:平常用什么工具测接口? 4: webService 接口是如何测试的? 5:没有接口文档,如何做接口测试? 6&…

使用EVE-NE-锐捷实现NAT+ACL服务限制

一、项目拓扑 二、项目实现 1.NET配置 点击左侧的NetWorks,设置与图相同的配置,实现实验环境桥接到物理网络 2.GW配置 进入特权模式 enable进入全局模式 configure terminal 更改名称为GW hostname GW进入g0/0接口 interface g0/0将g0/0接口IP地址配置为192.168.…

nginx 实战配置

一、配置一个默认80端口的,静态页面,路径是path1。 http://192.168.0.111/path1 , /path1路径指向linux的/data/index1.html vi /data/nginx-1.24.0/conf/nginx.conf 文件添加以下配置 location /path1 { alias /data/…

kubekey一键部署k8s高可用与kubesphere

kubekey一键安装k8s与kubesphere还是蛮方便的,kubesphere官网上面也提到了高可用安装的一些事宜,但是没有涉及到kubesphere资深的redis的系统的部署问题,本文简单给出对应配置,其实这个配置在kubephere的cluster-configuration.ya…

怎么使用服务器运行pySCENIC

前言 我们注意到在其他的一些论坛,有一些用户反馈,在服务器上面运行pyscenic不太顺畅。本文我们整理了在服务器上运行pyscenic的三个方法供大家参考,分别是conda安装pyscenic运行、arboreto_with_multiprocessing运行、容器化运行。总的来说&…

QEMU 搭建arm linux开发环境

Qemu 作为一款强大的开源虚拟化软件,为我们提供了一个便捷且经济实惠的方式来模拟各种硬件环境,从而在上面安装和学习 Linux 系统。本文将详细介绍如何使用 Qemu 搭建 Linux 学习环境, 环境准备 操作系统:建议使用 Ubuntu 20.04…

坐井说天阔---DeepSeek-R1

前言 DeepSeek-R1这么火,虽然网上很多介绍和解读,但听人家的总不如自己去看看原论文。于是花了大概一周的时间,下班后有进入了研究生的状态---读论文。 DeepSeek这次的目标是探索在没有任何监督数据的情况下训练具有推理能力的大模型&#…

EasyExcel 复杂填充

EasyExcel ​Excel表格中用{}或者{.} 来表示包裹要填充的变量,如果单元格文本中本来就有{、}左右大括号,需要在括号前面使用斜杠转义\{ 、\}。 ​代码中被填充数据的实体对象的成员变量名或被填充map集合的key需要和Excel中被{}包裹的变量名称一致。 …

华为防火墙pppoe拨号接入互联网配置案例

目录 1.pppoe拨号背景2.网络拓扑3.网络需求4.网络配置4.1 网络基础配置4.2 pppoe配置4.2.1 pppoe服务端配置(现网环境可忽略)4.2.2 pppoe客户端配置4.2.3 结果验证 5.小结 1.pppoe拨号背景 PPPoE(Point-to-Point Protocol Over Ethernet)拨号产生的背景…

认识vue-admin

认识vue-admin **核心交付:** 为什么要基于现成架子二次开发 什么是二次开发:基于已有的代码(项目工程,脚手架)开进行新功能的开发 所以看懂已有的框架中的既有代码,变得很重要了 1. 背景知识 后台管理系统是一种最…

【16】思科AireOS:创建使用 LWA 认证的 WLAN

1. 概述 LWA(Local Web Authentication)是一种基于 Web 认证的方式,允许无线客户端在连接 WLAN 后,使用 Web 认证页面进行身份验证。该方法适用于访客网络或需要身份认证的场景。 本指南详细介绍如何在 Cisco AireOS 无线控制器(WLC)上配置 LWA 认证的 WLAN,并确保认证…

电解电容的参数指标

容量 这个值通常是室温25℃,在一定频率和幅度的交流信号下测得的容量。容量会随着温度、直流电压、交流电压值的变化而改变。 额定电压 施加在电容上的最大直流电压,通常要求降额使用。 例如额定电压是4V,降额到70%使用,最高施…

【C++】IO流

目录 一、C语言的输入与输出二、流是什么三、CIO流3.1 C标准IO流3.2 C文件IO流3.2.1 二进制读写3.2.2 文本读写 四、stringstream的简单介绍结尾 一、C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据…

软件开发 | GitHub企业版常见问题解读

什么是GitHub企业版? GitHub企业版是一个企业级软件开发平台,专为现代化开发的复杂工作流程而设计。 作为可扩展的平台解决方案,GitHub企业版使组织能够无缝集成其他工具和功能,并根据特定需求定制开发环境,提高整体…

红黑树:高效平衡二叉树的奥秘

🌟 快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。🌟 引言 在数据结构的奇妙世界里🧐,二叉搜索树就像一把神奇的钥匙,能高效地查找数据。但这把钥匙也…

[免费]SpringBoot公益众筹爱心捐赠系统【论文+源码+SQL脚本】

大家好,我是老师,看到一个不错的SpringBoot公益众筹爱心捐赠系统,分享下哈。 项目介绍 公益捐助平台的发展背景可以追溯到几十年前,当时人们已经开始通过各种渠道进行公益捐助。随着互联网的普及,本文旨在探讨公益事业…