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)的原则。就像一摞盘子,最后放上去的盘子总是最先被拿走。栈有两个主要操作: 入栈&…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
Python网页自动化Selenium中文文档
1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API,让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API,你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...
QT开发技术【ffmpeg + QAudioOutput】音乐播放器
一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下,音视频内容犹如璀璨繁星,点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频,到在线课堂中知识渊博的专家授课,再到影视平台上扣人心弦的高清大片,音…...
Yii2项目自动向GitLab上报Bug
Yii2 项目自动上报Bug 原理 yii2在程序报错时, 会执行指定action, 通过重写ErrorAction, 实现Bug自动提交至GitLab的issue 步骤 配置SiteController中的actions方法 public function actions(){return [error > [class > app\helpers\web\ErrorAction,],];}重写Error…...
