15.1 Process(进程)类

news2025/3/12 12:32:35

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

通常开发时想要获得进程是比较困难的事,必须要调用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.coloradmin.cn/o/2299833.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CentOS 7 企业级Redis 7部署指南

CentOS 7 企业级Redis 7部署指南 目录导航 一、环境准备 1.1 依赖管理 二、离线安装 2.1 源码编译安装2.2 目录结构规范 三、生产配置 3.1 主配置文件3.2 配置生成脚本 四、系统集成 4.1 Systemd服务文件4.2 服务管理命令 五、安全加固 5.1 网络安全配置5.2 审计配置 六、性能…

消息中间件深度剖析:以 RabbitMQ 和 Kafka 为核心

在现代分布式系统和微服务架构的构建中,消息中间件作为一个不可或缺的组件,承担着系统间解耦、异步处理、流量削峰、数据传输等重要职能。尤其是在面临大规模并发、高可用性和可扩展性需求时,如何选择合适的消息中间件成为了开发者和架构师们…

大语言模型简史:从Transformer(2017)到DeepSeek-R1(2025)的进化之路

2025年初,中国推出了具有开创性且高性价比的「大型语言模型」(Large Language Model — LLM)DeepSeek-R1,引发了AI的巨大变革。本文回顾了LLM的发展历程,起点是2017年革命性的Transformer架构,该架构通过「…

java八股文-spring

目录 1. spring基础 1.1 什么是Spring? 1.2 Spring有哪些优点? 1.3 Spring主要模块 1.4 Spring常用注解 1.5 Spring中Bean的作用域 1.6 Spring自动装配的方式 1.7 SpringBean的生命周期 1.8 多级缓存 1.9 循环依赖? 1 .8.1 原因 1.8…

NLP 八股 DAY1:BERT

BERT全称:Pre-training of deep bidirectional transformers for language understanding,即深度双向Transformer。 模型训练时的两个任务是预测句⼦中被掩盖的词以及判断输⼊的两个句⼦是不是上下句。在预训练 好的BERT模型后⾯根据特定任务加上相应的⽹…

蓝桥与力扣刷题(230 二叉搜索树中第k小的元素)

题目:给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(从 1 开始计数)。 示例 1: 输入:root [3,1,4,null,2], k 1 输出:1示例 2&#xff…

半遮挡检测算法 Detecting Binocular Half-Occlusions

【1. 背景】: 本文分析【Detecting Binocular Half-Occlusions:Empirical Comparisons of Five Approaches】Geoffrey Egnal和Richard P. Wildes于2002年发表在IEEE Transactions on Pattern Analysis and Machine Intelligence上,这是1篇中…

PHP培训机构教务管理系统小程序

🔑 培训机构教务管理系统——智慧教育,高效管理新典范 🚀 这款教务管理系统,是基于前沿的ThinkPHP框架与Uniapp技术深度融合,匠心打造的培训机构管理神器。它犹如一把开启高效运营与精细管理的金钥匙,专为…

无人机不等同轴旋翼架构设计应用探究

“结果显示,对于不等组合,用户应将较小的螺旋桨置于上游以提高能效,但若追求最大推力,则两个相等的螺旋桨更为理想。” 在近期的研究《不等同轴旋翼性能特性探究》中,Max Miles和Stephen D. Prior博士深入探讨了不同螺…

CTFHub技能树-密码口令wp

目录 引言弱口令默认口令 引言 仅开放如下关卡 弱口令 通常认为容易被别人(他们有可能对你很了解)猜测到或被破解工具破解的口令均为弱口令。 打开环境,是如下界面,尝试一些弱口令密码无果 利用burpsuite抓包,然后爆…

【NLP251】BertTokenizer 的全部 API 及 使用案例

BertTokenizer 是 Hugging Face 的 transformers 库中用于处理 BERT 模型输入的分词器类。它基于 WordPiece 分词算法,能够将文本分割成词汇单元(tokens),并将其转换为 BERT 模型可以理解的格式。BertTokenizer 是 BERT 模型的核心…

【MySQL常见疑难杂症】常见文件及其所存储的信息

1、MySQL配置文件的读取顺序 (非Win)/etc/my.cnf、/etc/mysql/my.cnf、/usr/local/mysql/etc/my.cnf、~/.my.cnf 可以通过命令查看MySQL读取配置文件的顺序 [roothadoop01 ~]# mysql --help |grep /etc/my.cnf /etc/my.cnf /etc/mysql/my.c…

IDEA集成DeepSeek

引言 随着数据量的爆炸式增长,传统搜索技术已无法满足用户对精准、高效搜索的需求。 DeepSeek作为新一代智能搜索技术,凭借其强大的语义理解与深度学习能力,正在改变搜索领域的游戏规则。 对于 Java 开发者而言,将 DeepSeek 集成…

leetcode:627. 变更性别(SQL解法)

难度:简单 SQL Schema > Pandas Schema > Salary 表: ----------------------- | Column Name | Type | ----------------------- | id | int | | name | varchar | | sex | ENUM | | salary | int …

SQLMesh系列教程-3:SQLMesh模型属性详解

SQLMesh 的 MODEL 提供了丰富的属性,用于定义模型的行为、存储、调度、依赖关系等。通过合理配置这些属性,可以构建高效、可维护的数据管道。在 SQLMesh 中,MODEL 是定义数据模型的核心结构,初学SQLMesh,定义模型看到属…

【Leetcode 952】按公因数计算最大组件大小

题干 给定一个由不同正整数的组成的非空数组 nums ,考虑下面的图: 有 nums.length 个节点,按从 nums[0] 到 nums[nums.length - 1] 标记;只有当 nums[i] 和 nums[j] 共用一个大于 1 的公因数时,nums[i] 和 nums[j]之…

【第4章:循环神经网络(RNN)与长短时记忆网络(LSTM)— 4.6 RNN与LSTM的变体与发展趋势】

引言:时间序列的魔法钥匙 在时间的长河中,信息如同涓涓细流,绵延不绝。而如何在这无尽的数据流中捕捉、理解和预测,正是循环神经网络(RNN)及其变体长短时记忆网络(LSTM)所擅长的。今天,我们就来一场深度探索,揭开RNN与LSTM的神秘面纱,看看它们如何在时间序列的海洋…

简单几个步骤完成 Oracle 到金仓数据库(KingbaseES)的迁移目标

作为国产数据库的领军选手,金仓数据库(KingbaseES)凭借其成熟的技术架构和广泛的市场覆盖,在国内众多领域中扮演着至关重要的角色。无论是国家电网、金融行业,还是铁路、医疗等关键领域,金仓数据库都以其卓…

八、SPI读写XT25数据

8.1 SPI 简介 SPI(Serial Peripheral Interface,串行外设接口)是一种同步串行通信协议,广泛用于嵌入式系统中连接微控制器与外围设备,如传感器、存储器、显示屏等。 主要特点 1. 全双工通信:支持同时发送…

Visionpro 齿轮测量

效果展示 一、题目要求 求出最大值,最小值,平均值 二、分析 1.首先要进行模板匹配 2.划清匹配范围 3.匹配小三角的模板匹配 4.卡尺 5.用找圆工具 工具 1.CogPMAlignTool 2.CogCaliperTool 3.CogFindCircleTool 4.CogFixtureTool 三、模板匹…