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

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...

【C++进阶篇】智能指针

C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

android RelativeLayout布局

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存&#xff1a;一级缓存、二级缓存 默认情况下&#xff0c;只有一级缓存开启&#xff08;sqlSession级别的缓存&#xff09;二级缓存需要手动开启配置&#xff0c;需要局域namespace级别的缓存 一级缓存&#xff08;本地缓存&#…...