0

0

C#怎么获取所有正在运行的进程_C#如何显示任务管理器列表【实战】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-03-18 15:18:13

|

246人浏览过

|

来源于php中文网

原创

直接调用 Process.GetProcesses() 可获取当前会话及全局可见服务进程的快照数组,但受权限限制(需管理员权限才能访问系统/其他用户进程),且返回值为静态快照、非实时流;常见异常如“拒绝访问”源于 Windows 权限机制,并非代码错误。

c#怎么获取所有正在运行的进程_c#如何显示任务管理器列表【实战】

怎么用 Process.GetProcesses() 拿到所有进程

直接调用 Process.GetProcesses() 就能拿到当前机器上所有可访问的进程快照,返回的是 Process[] 数组。它不区分用户权限,但受制于当前进程的权限级别——比如以普通用户运行,就看不到系统级进程(如 svchost.exe 的某些实例)或其它用户会话里的进程。

常见错误是没加异常处理,一遇到无权限进程就抛 System.ComponentModel.Win32Exception: 拒绝访问。这不是代码写错了,是 Windows 权限机制在起作用。

  • 需要查看完整列表?得用管理员权限启动你的程序,否则必然漏掉一部分
  • 想跨用户会话(比如远程桌面多个登录)?GetProcesses() 本身做不到,它只返回当前会话 + 全局可见服务进程,且依赖 SeDebugPrivilege 权限
  • 返回结果是快照,不是实时流;要“刷新”,得重新调用,不能靠监听

为什么 Process.ProcessName 和任务管理器里看到的名字不一致

任务管理器显示的“名称”其实是可执行文件名(不含扩展名),而 Process.ProcessName 返回的也是这个——但它不包含路径、不带版本信息、也不反映窗口标题。所以你会看到:chrome.exe 对应一堆 chromeCode.exe 全部叫 Code,根本分不清哪个是主窗口、哪个是渲染进程。

真正和任务管理器对齐的方式,是结合 Process.MainWindowTitle 或查 Process.Modules(需管理员权限),但后者开销大、易失败。

  • Process.ProcessName 是最轻量的标识,适合按类型统计(比如杀掉所有 python 进程)
  • 想区分同名进程?得看 Process.IdProcess.SessionId、或者尝试读 Process.MainWindowHandle != IntPtr.Zero 判断是否有 GUI
  • 注意:.NET 6+ 中 Process.StartTime 在某些低权限下可能为 DateTime.MinValue,别拿它做排序依据

如何安全地避免“拒绝访问”异常并过滤出有效进程

硬 try-catch 每个 Process 属性是最常见的做法,但效率低、掩盖问题。更稳妥的是先获取进程 ID 列表,再逐个尝试打开——或者直接用 Process.GetProcesses() 后立即过滤掉 HasExited == true 的项(虽然概率小,但多线程下真会发生)。

百灵大模型
百灵大模型

蚂蚁集团自研的多模态AI大模型系列

下载

下面这段逻辑能绕过大部分权限问题,又不崩:

var processes = Process.GetProcesses();
var validProcesses = new List<Process>();
foreach (var p in processes)
{
    try
    {
        // 只访问最基础字段,避免触发权限检查
        if (!p.HasExited && !string.IsNullOrEmpty(p.ProcessName))
        {
            validProcesses.Add(p);
        }
    }
    catch (InvalidOperationException) { /* 已退出 */ }
    catch (Win32Exception) { /* 拒绝访问,跳过 */ }
}
  • 不要在循环里调 p.MainWindowTitlep.Threads,这些极易触发异常
  • 如果只要进程名和 ID,用 Process.GetProcesses().Select(p => new { p.Id, p.ProcessName }) 是安全的
  • 在 Windows Server 或多会话环境中,SessionId == 0 通常表示服务会话,普通用户进程 SessionId > 0

任务管理器“详细信息”页的内存/CPU 数据怎么对应到 C#

任务管理器显示的“内存(使用量)”对应 Process.WorkingSet64,不是 PrivateMemorySize64;CPU 占用率它用的是采样差值,C# 里没有现成等价属性,必须自己算 Process.TotalProcessorTime 在两次采样间的增量除以经过时间。

也就是说:你不能只读一次 TotalProcessorTime 就说“CPU 占了 30%”,那只是自进程启动以来的累计占比。

  • WorkingSet64 是进程当前占用的物理内存(字节),和任务管理器“内存”列基本一致
  • 想模拟任务管理器的 CPU%,至少要间隔 500ms 以上采两次 TotalProcessorTime,再除以 (结束时间 - 开始时间).TotalMilliseconds * Environment.ProcessorCount
  • 注意:.NET Core/.NET 5+ 中 Process.PeakVirtualMemory64 在某些容器环境下可能始终为 0,别依赖它做判断

真实环境里,进程列表本身不难拿,难的是怎么在不崩溃、不漏数据、不误导用户的前提下,把“看起来像任务管理器”的信息稳定呈现出来——尤其是权限边界、采样时机、字段语义差异这三块,最容易被当成理所当然而踩坑。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c#是什么意思
c#是什么意思

C#是一种通用的面向对象编程语言,它在.NET框架上运行,可用于开发各种类型的应用程序。本专题为大家提供c#相关的各种文章、以及下载和课程。

279

2023.08.08

什么是c#
什么是c#

C#(读作C Sharp)是一种现代的、通用的、面向对象的编程语言。它由微软公司开发,于2000年首次发布,主要用于开发Windows桌面应用程序、Web应用程序、移动应用程序以及游戏开发等领域。C#是一种类型安全和托管的编程语言,它结合了C++的强大性能和C语言的简单易学特点,并引入了许多新的特性和概念,如委托、属性、泛型和异步编程等,以提高开发效率和代码可维护性。

185

2023.08.31

C#中base关键字的用法
C#中base关键字的用法

在C#中,base关键字用于访问当前类的基类成员,这包括基类的字段、属性、方法、构造函数、索引器以及事件。想了解更多C#的相关内容,可以阅读本专题下面的文章。

327

2024.03.13

C#Task用法
C#Task用法

Task在C#中是用于表示异步操作的对象,它位于System.Threading.Tasks命名空间中。想了解更多C#中各种用法的相关内容,可以阅读本专题下面的文章。

380

2024.03.14

C# 并发与异步编程
C# 并发与异步编程

本专题系统讲解 C# 异步编程与并发控制,重点介绍 async 和 await 关键字、Task 类、线程池管理、并发数据结构、死锁与线程安全问题。通过多个实战项目,帮助学习者掌握 如何在 C# 中编写高效的异步代码,提升应用的并发性能与响应速度。

29

2026.02.03

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

107

2026.02.06

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

415

2026.03.11

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1562

2023.07.26

Python WebSocket实时通信与异步服务开发实践
Python WebSocket实时通信与异步服务开发实践

本专题聚焦 Python 在实时通信场景中的开发实践,系统讲解 WebSocket 协议原理、长连接管理、消息推送机制以及异步服务架构设计。内容包括客户端与服务端通信实现、连接稳定性优化、消息队列集成及高并发处理策略。通过完整案例,帮助开发者构建高效稳定的实时通信系统,适用于聊天应用、实时数据推送等场景。

3

2026.03.18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.6万人学习

C 教程
C 教程

共75课时 | 5.6万人学习

C++教程
C++教程

共115课时 | 22.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号