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常用属性:
- Id:获取进程的唯一标识符。
- MainModule:获取进程的主模块。
- MainWindowTitle:获取进程的主窗口标题。注意:只有当进程具有图形界面的情况下,才有与之关联的主窗口。
- MainWindowHandle:获取进程主窗口的窗口句柄。
- Modules:获取已由进程加载的模块。
- ProcessName:获取该进程的名称。
- StartInfo:要传递给 Process 的 Start 方法的属性。
- StartTime:获取进程启动的时间。
- HasExited :指示进程是否已终止。
- ExitTime:进程退出的时间。注意:只有进程退出后才能调用此属性,否则会产生错误,请先用HasExited属性判断进程是否已经终止。
- Threads:获取在进程中运行的一组线程。
- PriorityClass:进程的总体优先级类别。
- BasePriority:获取进程的基本优先级。
- EnableRaisingEvents:在进程终止时是否应引发 Exited 事件。
- MachineName:获取进程正在其上运行的计算机的名称。
- NonpagedSystemMemorySize64:获取为进程分配的非分页系统内存量。
- PagedMemorySize64:获取为进程分配的分页内存量。
- PagedSystemMemorySize64:获取为进程分配的可分页系统内存量。
- PeakPagedMemorySize64:获取进程使用的虚拟内存分页文件中的最大内存量。
- PeakVirtualMemorySize64:获取进程使用的最大虚拟内存量。
- PeakWorkingSet64:获取进程使用的最大物理内存量。
- PriorityBoostEnabled:指示主窗口拥有焦点时是否应由操作系统暂时提升关联进程优先级。
- PrivateMemorySize64:获取为进程分配的专用内存量。
- PrivilegedProcessorTime:获取进程的特权处理器时间。
- Responding:获取指示进程的用户界面当前是否响应的值。
- TotalProcessorTime:获取进程的总的处理器时间。
- UserProcessorTime:获取进程的用户处理器时间。
- VirtualMemorySize64:获取为进程分配的虚拟内存量。
- WorkingSet64:获取为进程分配的物理内存量。
Process常用方法:
- Start:启动进程资源。通常情况下,参数可以直接传递文件路径或网址的字符串,进程会调用关联的程序打开参数指定的文件或网址。例如:
默认程序(通常是记事本)打开文本文件:
Process.Start("C:\\lessons\\将进酒.txt");
或者默认浏览器打开网址:
Process.Start("http://www.csdn.net");
- Kill:强制终止进程。注意:不建议使用此方法终止进程,因为此方法会导致进程立即终止,导致进程不能处理退出前的必要工作(比如有些程序会在退出前保存当前设置),导致进程异常终止。通常情况下应使用CloseMainWindow来结束进程。
- GetProcesses:创建新的 Process 组件的数组,并将它们与现有进程资源关联。
- GetProcessesByName:创建新的 Process 组件的数组,并将它们与共享指定的进程名称的所有现有进程资源关联。
- Process.GetProcessById:创建新的 Process 组件,并将其与您指定的现有进程资源关联。
- GetCurrentProcess:获取新的 Process 组件并将其与当前活动的进程关联。
- Close:释放与此组件关联的所有资源。
- 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常用属性:
- BaseAddress:加载模块的内存地址。
- FileName:模块的完整路径。
- FileVersionInfo:获取模块的版本信息。
- ModuleMemorySize:获取加载模块所需内存大小。
- 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 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取ÿ…...
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)的原则。就像一摞盘子,最后放上去的盘子总是最先被拿走。栈有两个主要操作: 入栈&…...
如何快速掌握高级机器学习:深度学习算法进阶的完整指南
如何快速掌握高级机器学习:深度学习算法进阶的完整指南 【免费下载链接】data-science 📊 Path to a free self-taught education in Data Science! 项目地址: https://gitcode.com/gh_mirrors/da/data-science GitHub 加速计划 / da / data-scie…...
新手福音:用快马零代码基础制作九么动漫版本介绍页
作为一个刚接触编程的新手,想要制作一个动漫介绍网站可能会觉得无从下手。但通过InsCode(快马)平台,我发现这个过程可以变得非常简单有趣。下面我就分享一下如何零基础制作"九么1.0.31免费版动漫"介绍页的完整过程。 首先明确页面需求 作为一个…...
辅助码怎么选?一份客观数据帮你定
一 辅助码方案介绍音形码是将汉字读音与字形结构相结合的一类输入编码。它兼顾拼音的上手门槛与形码的低重码优势,特别适合习惯拼音输入、却长期被同音字选字拖累效率的用户,是提升打字准确率与输入速度的优质选择。在拼音输入法主导当下,越来…...
基于视觉语言模型的UI设计稿自动代码生成实践
1. 项目背景与核心价值去年在重构一个企业级后台管理系统时,我对着Figma设计稿手动编写了87个几乎雷同的表格组件。当第N次复制粘贴相似的props时,突然意识到:既然视觉稿已经包含了完整的布局和样式信息,为什么不能让机器直接读懂…...
明日方舟基建自动化管理:从手动烦恼到智能管家
明日方舟基建自动化管理:从手动烦恼到智能管家 【免费下载链接】arknights-mower 《明日方舟》长草助手 项目地址: https://gitcode.com/gh_mirrors/ar/arknights-mower 问题场景切入:当基建管理成为游戏负担 凌晨2点,小陈盯着手机屏…...
相机标定入门:DLT、对极几何和PnP到底啥关系?一张图讲清楚
相机标定三剑客:DLT、对极几何与PnP的实战关系图谱 刚接触计算机视觉时,我总被各种标定算法绕得晕头转向——为什么论文里DLT和对极几何总是一起出现?PnP算法又为什么要用DLT做初始化?直到亲手实现了一个AR标记检测系统后…...
从零开始的手写数字识别实战:homemade-machine-learning MNIST分类完整指南
从零开始的手写数字识别实战:homemade-machine-learning MNIST分类完整指南 【免费下载链接】homemade-machine-learning 🤖 Python examples of popular machine learning algorithms with interactive Jupyter demos and math being explained 项目地…...
Docker 27跨架构镜像构建避坑手册(27个真实CI/CD故障现场复盘)
更多请点击: https://intelliparadigm.com 第一章:Docker 27跨架构镜像构建全景认知 Docker 27 引入了原生增强的跨架构镜像构建能力,依托 BuildKit 的深度集成与 QEMU 用户态模拟的自动化协同,显著降低了 multi-arch 构建的运维…...
从DFH3到DFH5:一文看懂中国通信卫星平台的‘家族谱系’与技术演进
从DFH3到DFH5:中国通信卫星平台的技术进化图谱 当一颗卫星在3.6万公里的地球同步轨道上定点时,它的"心脏"——卫星平台决定了这颗太空资产的生命力。中国航天人用三十年时间,在浩瀚太空书写了一部卫星平台的进化史。从最初DFH3平台…...
【AI Agent实战】竞品分析的正确姿势:四象限 + 对标矩阵 + 护城河三板斧,为你的产品找到独占位
导读:很多人做竞品分析,上来就列一张"功能对比表",然后得出一个不痛不痒的结论:“我们有,他们也有。”——这样的分析对决策毫无帮助。本文用我自己的项目 DocCenter 为例,完整拆解一套可复用的竞…...
