C#获取当前系统所有正在运行的进程列表

竹里
竹里
发布时间:2026-10-14| 5人浏览过
原创

在C#开发中,有时需要获取当前操作系统上所有正在运行的程序实例。本文将介绍如何利用System.Diagnostics命名空间中的Process类来实现这一功能,并通过判断主窗口句柄来筛选出具有图形界面的应用程序。

实现原理与目标

C#提供了强大的系统交互能力,其中System.Diagnostics.Process类允许开发者访问和管理系统中的进程。通过枚举本地计算机上的所有进程,我们可以收集其基本信息(如进程名称、ID等),并根据特定条件(例如是否存在可见的主窗口)进行过滤,从而找出当前正在运行的用户级应用程序。

准备条件

  • 项目需引入System.Diagnostics命名空间。
  • 确保运行环境拥有足够的权限以读取其他进程的信息(某些系统进程可能需要管理员权限才能完整访问)。
  • 使用System.Environment.MachineName指定操作本地机器,这是获取当前计算机进程的标准方式。

第1步:导入必要的命名空间

首先,必须在代码文件顶部引入System.Diagnostics,以便使用Process类和相关的静态方法。

using System.Diagnostics;
using System; // 用于Console输出

第2步:获取本地所有进程列表

调用Process.GetProcesses()静态方法,传入当前机器名作为参数,返回一个包含所有本地进程的数组或集合。此步骤会将系统后台服务、用户应用程序等全部加载到内存列表中。

// 获取当前计算机上的所有进程
Process[] processes = Process.GetProcesses(System.Environment.MachineName); 

第3步:遍历并筛选有主窗口的程序

并非所有进程都代表“正在运行的程序”,许多是后台服务且无图形界面。我们可以通过检查每个进程的MainWindowHandle属性来区分:IntPtr.Zero表示没有可见的主窗口,非零值则表示该进程拥有一个GUI窗口。仅处理这些具有可视界面的进程。

foreach (Process p in processes)
{
    // 检查是否有主窗口句柄
    if (p.MainWindowHandle != IntPtr.Zero)
    {
        // 这里可以进一步获取p.ProcessName, p.Id等信息
        Console.WriteLine(p.ProcessName); 
    }
}

关键注意事项

  • 性能影响:当系统运行大量进程时,GetProcesses可能会稍显缓慢。对于实时性要求不高的场景完全可行,若需高频监控,建议缓存结果或增加间隔。
  • 权限问题:如果尝试访问某些受保护的系统进程信息,可能会抛出Win32Exception。建议在循环内加入try-catch块以防止单进程错误中断整个列表。
  • 空窗口进程:有些程序可能在启动瞬间或异常情况下出现但无窗口,它们将被忽略,这通常符合“列出正在运行程序”的用户预期。

完善后的健壮代码示例

为了增强代码的稳定性,建议添加异常处理,确保即使遇到无法访问的进程也不会导致程序崩溃。

using System;
using System.Diagnostics;

class Program
{
    static void Main()
    {
        try
        {
            // 获取本地所有进程
            Process[] allProcesses = Process.GetProcesses(System.Environment.MachineName);

            Console.WriteLine("正在运行的应用程序列表:");
            int count = 0;

            foreach (Process p in allProcesses)
            {
                try
                {
                    // 必须捕获可能的Win32Exception,因为某些进程无权访问
                    if (p.MainWindowHandle != IntPtr.Zero)
                    {
                        Console.WriteLine($"ID: {p.Id} | 名称: {p.ProcessName}");
                        count++;
                    }
                }
                catch (InvalidOperationException)
                {
                    // 进程可能已结束
                    continue;
                }
                catch (Win32Exception)
                {
                    // 权限不足,跳过
                    continue;
                }
            }

            Console.WriteLine($"\n共找到 {count} 个具有窗口界面的进程。");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"发生错误: {ex.Message}");
        }
    }
}

完成判断

运行上述代码后,控制台将打印出当前系统中所有拥有主窗口标题的进程ID和名称。如果列表中包含了你期望看到的应用程序(如浏览器、编辑器等),则说明实现成功。

简要总结

本文详细介绍了如何使用C#的System.Diagnostics.Process类来枚举并筛选当前系统正在运行的程序。核心技巧在于结合GetProcesses方法获取全量进程,并利用MainWindowHandle属性过滤掉无UI的后台服务。通过添加适当的异常处理,可以构建出一个稳定且实用的进程查看工具。

以上就是C#列出当前系统所有正在运行程序方法的详细内容,更多关于C#进程管理与系统检测的资料请关注本站其它相关文章!
相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。