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…...
事件传递和监控
今天介绍一下UIApplication的函数 - (BOOL)sendAction:to:from:forEvent: - (BOOL)sendAction:to:from:forEvent: 是 UIApplication 类中的一个方法,主要用于发送事件响应链中的动作(action)。它允许应用程序从一个特定的发送者(…...
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 审计配置 六、性能…...
Python创建Excel的方式——提供4中方式可供参考
目录 专栏导读库的安装代码1——pandas代码2——openpyxl代码3——xlsxwriter代码4——xlwings总结 专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️🌈 博客主页:请点击——>…...
消息中间件深度剖析:以 RabbitMQ 和 Kafka 为核心
在现代分布式系统和微服务架构的构建中,消息中间件作为一个不可或缺的组件,承担着系统间解耦、异步处理、流量削峰、数据传输等重要职能。尤其是在面临大规模并发、高可用性和可扩展性需求时,如何选择合适的消息中间件成为了开发者和架构师们…...
回文数:简单问题中的多种优化思路
回文数:简单问题中的多种优化思路 引言 回文数(Palindrome Number)是一个有趣的问题,在算法竞赛、面试、甚至一些实际应用场景中都会遇到。最直观的方式是将数字转换成字符串,然后反转比较。但仅仅满足“能解”是不够…...
大语言模型简史:从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…...
机器学习--实现多元线性回归
机器学习—实现多元线性回归 本节顺延机器学习--线性回归中的内容,进一步讨论多元函数的回归问题 y ′ h ( x ) w ⊤ ∙ x b y^{\prime}h(x)w^\top\bullet xb y′h(x)w⊤∙xb 其中, w T ⋅ x 就是 W 1 X 1 w 2 X 2 w 3 X 3 ⋯ w N X N \text{其中,}w^\math…...
vue3响应式丢失解决办法(三)
vue3的响应式的理解,与普通对象的区别(一) vue3 分析总结响应式丢失问题原因(二) 经过前面2篇文章,知道了响应式为什么丢失了,但是还是碰到了丢失情况,并且通过之前的内容还不能解…...
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ÿ…...
半遮挡检测算法 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技术深度融合,匠心打造的培训机构管理神器。它犹如一把开启高效运营与精细管理的金钥匙,专为…...
《LeetCode 763. 划分字母区间 | 高效分割字符串》
内容: 问题描述: 给定一个字符串 S,将字符串分割成若干个子串,使得每个子串中的字符都不重复,并且返回每个子串的长度。 解题思路: 找到每个字符最后一次出现的位置:我们首先遍历一遍字符串&a…...
无人机不等同轴旋翼架构设计应用探究
“结果显示,对于不等组合,用户应将较小的螺旋桨置于上游以提高能效,但若追求最大推力,则两个相等的螺旋桨更为理想。” 在近期的研究《不等同轴旋翼性能特性探究》中,Max Miles和Stephen D. Prior博士深入探讨了不同螺…...
什么是 大语言模型中Kernel优化
什么是 大语言模型中Kernel优化 目录 什么是 大语言模型中Kernel优化Kernel优化操作系统内核优化深度学习计算内核优化手工优化原理举例Flash Attention,Faster TransformerKernel优化 大语言模型存在访存密集操作(如注意力机制、LayerNorm等),这些操作使得GPU计算性能无法…...
DeepSeek与ChatGPT:AI语言模型的全面对决
DeepSeek与ChatGPT:AI语言模型的全面对决 引言:AI 语言模型的时代浪潮一、认识 DeepSeek 与 ChatGPT(一)DeepSeek:国产新星的崛起(二)ChatGPT:AI 界的开拓者 二、DeepSeek 与 ChatGP…...
CTFHub技能树-密码口令wp
目录 引言弱口令默认口令 引言 仅开放如下关卡 弱口令 通常认为容易被别人(他们有可能对你很了解)猜测到或被破解工具破解的口令均为弱口令。 打开环境,是如下界面,尝试一些弱口令密码无果 利用burpsuite抓包,然后爆…...
Deepseek R1模型本地化部署与API实战指南:释放企业级AI生产力
摘要 本文深入解析Deepseek R1开源大模型的本地化部署流程与API集成方案,涵盖从硬件选型、Docker环境搭建到模型微调及RESTful接口封装的完整企业级解决方案。通过电商评论分析和智能客服搭建等案例,展示如何将前沿AI技术转化为实际生产力。教程支持Lin…...
MISP从入门到实战:威胁情报共享平台搭建与使用详解
MISP从入门到实战:威胁情报共享平台搭建与使用详解 目录 MISP核心作用与价值MISP安装与部署 2.1 Docker快速部署2.2 手动安装(Ubuntu) MISP基础使用教程 3.1 创建事件与属性3.2 数据共享与同步3.3 威胁情报分析实战 MISP高级功能 4.1 Galaxy…...
【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…...
InnoDB如何解决幻读?深入解析MySQL的并发控制机制
--- ## 一、什么是幻读(Phantom Read)? **幻读**是数据库事务隔离性中的一个典型问题,具体表现为: 在同一个事务中,多次执行相同的范围查询(Range Query)时,**后一次…...
栈的深度解析:从基础实现到高级算法应用——C++实现与实战指南
一、栈的核心算法与应用场景 栈的先进后出特性使其在以下算法中表现优异: 括号匹配:校验表达式合法性。表达式求值:中缀转后缀,逆波兰表达式求值。深度优先搜索(DFS):模拟递归调用。单调栈&am…...
IDEA集成DeepSeek
引言 随着数据量的爆炸式增长,传统搜索技术已无法满足用户对精准、高效搜索的需求。 DeepSeek作为新一代智能搜索技术,凭借其强大的语义理解与深度学习能力,正在改变搜索领域的游戏规则。 对于 Java 开发者而言,将 DeepSeek 集成…...
Oracle Trace文件突然增长很多的原因分析及解决办法
Oracle Trace文件突然增长很多可能是由多种原因引起的,例如SQL语句的长时间跟踪、错误的跟踪设置、大量的错误和警告信息等。 一、以下是一些解决Trace文件增长过快的方法: 1.清理旧的Trace文件 可以通过以下命令删除超过一定天数的Trace文件,例如删除3天前的Trace文件: …...
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,定义模型看到属…...
Java 中的 HashSet 和 HashMap 有什么区别?
一、核心概念与用途 特性HashSetHashMap接口实现实现 Set 接口(存储唯一元素)实现 Map 接口(存储键值对)数据存储存储单个对象(元素唯一)存储键值对(键唯一,值可重复)典…...
