当前位置: 首页 > news >正文

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#教程 目录

相关文章:

15.1 Process(进程)类

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 通常开发时想要获得进程是比较困难的事,必须要调用CreateToolhelpSnapshot、ProcessFirst、ProcessNext等API或者诸如 Zw…...

elasticsearch8 linux版以服务的方式启动

1.创建系统服务文件 对于使用 systemd 作为系统初始化系统的 Linux 发行版(如 CentOS 7 及以上、Ubuntu 16.04 及以上),需要创建一个 systemd 服务文件。以 root 用户或具有 sudo 权限的用户身份执行以下操作: sudo vim /etc/sy…...

小米 R3G 路由器刷机教程(Pandavan)

小米 R3G 路由器刷机教程(Pandavan) 一、前言 小米 R3G 路由器以其高性价比和稳定的性能备受用户青睐。然而,原厂固件的功能相对有限,难以满足高级用户的个性化需求。刷机不仅可以解锁路由器的潜能,还能通过第三方固…...

某大型业务系统技术栈介绍【应对面试】

微服务架构【图】 微服务架构【概念】 微服务架构,是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。在微服务架构中,服务与服务之间通信时,通常是…...

【区块链】零知识证明基础概念详解

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 零知识证明基础概念详解引言1. 零知识证明的定义与特性1.1 基本定义1.2 三个核心…...

建筑行业安全技能竞赛流程方案

一、比赛时间: 6月23日8:30分准时到场;9:00-10:00理论考试;10:10-12:00现场隐患答疑;12:00-13:30午餐;下午13:30-15:30现场…...

数据结构:图;邻接矩阵和邻接表

邻接矩阵: 1.概念: 邻接矩阵是图的存储结构之一,通过二维数组表示顶点间的连接关系。 2.具体例子 : 一.无向图邻接矩阵示例: 示例图(顶点:A、B、C,边:A-B、B-C&…...

DeepSeek-R1论文阅读及蒸馏模型部署

DeepSeek-R1论文阅读及蒸馏模型部署 文章目录 DeepSeek-R1论文阅读及蒸馏模型部署摘要Abstract一、DeepSeek-R1论文1. 论文摘要2. 引言3. DeepSeek-R1-Zero的方法3.1 强化学习算法3.2 奖励建模3.3 训练模版3.4 DeepSeek-R1-Zero的性能、自进化过程和顿悟时刻 4. DeepSeek-R1&am…...

OpenEuler学习笔记(三十三):在 OpenEuler 上搭建 OpenGauss 数据库环境

在 OpenEuler 上搭建 OpenGauss 数据库环境需要按照以下步骤进行。OpenGauss 是华为开源的一款高性能关系型数据库,支持高并发、高可用性和分布式部署。 1. 环境准备 确保你的 OpenEuler 系统满足以下要求: 操作系统:OpenEuler 20.03 LTS 或…...

[C++]多态详解

目录 一、多态的概念 二、静态的多态 三、动态的多态 3.1多态的定义 3.2虚函数 四、虚函数的重写(覆盖) 4.1虚函数 4.2三同 4.3两种特殊情况 (1)协变 (2)析构函数的重写 五、C11中的final和over…...

调用DeepSeek API接口:实现智能数据挖掘与分析

调用DeepSeek API接口:实现智能数据挖掘与分析 在当今数据驱动的时代,企业和开发者越来越依赖高效的数据挖掘与分析工具来获取有价值的洞察。DeepSeek作为一款先进的智能数据挖掘平台,提供了强大的API接口,帮助用户轻松集成其功能到自己的应用中。本文将详细介绍如何调用D…...

ffmpeg-cli-wrapper操作ffmpeg的工具

学习链接 ffmpeg-cli-wrapper - 内部封装了操作ffmpeg命令的java类库,它提供了一些类和方法,可以方便地构建和执行 ffmpeg 命令,而不需要直接操作字符串或进程。并且支持异步执行和进度监听 springboot-ffmpeg-m3u8-convertor - gitee代码 …...

【Qt】QObject类的主要功能

在 Qt 中,QObject 类是所有 Qt 对象的基类,提供了许多基础功能,使得 Qt 的对象系统能够有效地工作。它为其他类提供了核心的机制,比如信号和槽机制、对象树结构、内存管理等。 QObject 类的主要功能: 信号和槽机制&am…...

学习笔记之debian的thonny开发(尚未验证)--从stm32裸机到linux嵌入式系统

这应该算 stm32裸机用户 转 linux嵌入式系统 的入门学习笔记。 【鲁班猫】39-vnc远程桌面连接鲁班猫_哔哩哔哩_bilibili 本集的鲁班猫的视频介绍中,没有清晰明确指出需要linux开发板接入网络,接入网络可以使用有线网口或者wifi路由,有些提示…...

把 CSV 文件摄入到 Elasticsearch 中 - CSVES

在我们之前的很多文章里,我有讲到这个话题。在今天的文章中,我们就提重谈。我们使用一种新的方法来实现。这是一个基于 golang 的开源项目。项目的源码在 https://github.com/githubesson/csves/。由于这个原始的代码并不支持 basic security 及带有安全…...

PyQt组态软件 拖拽设计界面测试

PyQt组态软件测试 最近在研究PyQt,尝试写个拖拽设计界面的组态软件,目前实现的功能如下: 支持拖入控件,鼠标拖动控件位置 拖动控件边缘修改控件大小支持属性编辑器,修改当前选中控件的属性 拖动框选控件,点选控件 控…...

【Python爬虫(1)】专栏开篇:夯实Python基础

【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取&#xff…...

Java中的分布式(概念说明)

1. 分布式的基本概念 1.1 什么是分布式系统? 分布式系统(Distributed System):由多台服务器(或节点)协同工作,对外提供一个整体服务。不同节点之间通过网络通信来协同处理请求或共享数据&…...

Field ‘id‘ doesn‘t have a default value

1.程序测试时,运行到向数据库插入数据时,报以下异常 是id没有默认值; 在测试单元内单独向该数据库插入数据,报同样的异常,确定了异常的定位 2.项目时采用mybatisPlus操作数据库,报异常的数据库和另外一个数据库关联,主键ID和另外一个数据库相同,通过读取另外一个数据库的ID获…...

蓝桥杯 Java B 组之栈的应用(括号匹配、表达式求值)

一、栈的基本概念 栈(Stack)是一种特殊的线性数据结构,遵循后进先出(Last In First Out,LIFO)的原则。就像一摞盘子,最后放上去的盘子总是最先被拿走。栈有两个主要操作: 入栈&…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

docker详细操作--未完待续

docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

【JavaEE】-- HTTP

1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

【WebSocket】SpringBoot项目中使用WebSocket

1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖&#xff0c;添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...