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)的原则。就像一摞盘子,最后放上去的盘子总是最先被拿走。栈有两个主要操作: 入栈&…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...

五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...