C# WinForms实现简易进程管理器:查看、终止与优先级调整

桃夭
桃夭
发布时间:2026-10-15| 2人浏览过
原创

如何利用C#编写一个简单的桌面端进程管理工具?本文将演示使用Windows Forms构建界面,并通过调用System.Diagnostics命名空间下的核心API,实现对当前运行进程的读取、状态显示、异常终止及优先级重设等关键操作。

实现目标与准备

本教程的目标是构建一个具备基本功能的轻量级进程管理器。主要能力包括:

  • 进程监控:实时获取系统内所有进程的快照信息。
  • 交互控制:通过UI界面手动或批量修改进程属性。
  • 异常处理:当普通权限无法结束进程时,采用命令行工具辅助强制结束。

开发环境需配备支持 .NET Framework 4.0 及以上版本的 Visual Studio,以便创建 Windows Form 应用程序。

核心逻辑设计

整个程序基于事件驱动模型,核心数据流围绕 ListView 控件的刷新展开。在启动窗体或用户点击“刷新”按钮时,系统将重新查询操作系统当前的进程表。

第1步:获取并展示进程列表

目的:将系统内部的进程对象转化为可视化的表格数据。

动作说明:调用 Process.GetProcesses() 获取全部进程数组,遍历每个对象提取关键指标。

需要注意的是,访问某些系统保护进程的 MainModule 属性可能会抛出 Win32Exception,因此在实际代码中必须进行异常捕获处理,以防止程序崩溃。

以下是数据提取的核心逻辑片段:

private void getProcessInfo()
{
    try
    {
        listView1.Items.Clear();
        // 获取当前所有进程
        Process[] MyProcesses = Process.GetProcesses();
        
        // 更新状态栏显示总数量
        tsslInfo.Text = "进程总数:" + MyProcesses.Length.ToString();
        
        string[] Minfo = new string[6];
        foreach (Process MyProcess in MyProcesses)
        {
            try
            {
                Minfo[0] = MyProcess.ProcessName;
                // 注意:此处可能因权限不足引发异常,外层已用try-catch包裹整体循环或在具体属性访问处处理
                Minfo[1] = MyProcess.MainModule.ModuleName; 
                Minfo[2] = MyProcess.Threads.Count.ToString();
                Minfo[3] = MyProcess.BasePriority.ToString();
                
                // 转换为KB单位以便阅读
                Minfo[4] = Convert.ToString(MyProcess.WorkingSet / 1024) + "K";
                Minfo[5] = Convert.ToString(MyProcess.VirtualMemorySize / 1024) + "K";
                
                ListViewItem lvi = new ListViewItem(Minfo);
                listView1.Items.Add(lvi);
            }
            catch { /* 忽略无法访问内部数据的系统内核进程 */ }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("获取进程信息失败: " + ex.Message);
    }
}

程序运行后的效果如下图所示,包含了映像名称、物理内存及虚拟内存等列:

第2步:执行进程终止操作

目的:允许用户安全地退出特定应用程序,并在权限受阻时提供强力手段。

操作路径:选中某一行 → 右键点击 → 选择 “结束进程”。首先会弹出确认对话框以防误操作。

逻辑判断:

  1. 常规模式:调用 Process.Kill()。如果成功,立即调用刷新方法更新列表。
  2. 权限拒绝/异常模式:如果上述方法抛出异常,通常意味着需要更高权限或进程处于特殊锁定状态。此时触发备用方案:启动命令提示符并使用 ntsd 工具。

备用强制结束方案的实现细节如下:

// 构造CMD进程进行静默执行
Process cmdProc = new Process();
cmdProc.StartInfo.FileName = "cmd.exe";
cmdProc.StartInfo.UseShellExecute = false;
cmdProc.StartInfo.RedirectStandardInput = true;
cmdProc.StartInfo.RedirectStandardOutput = true;
cmdProc.StartInfo.RedirectStandardError = true;
cmdProc.StartInfo.CreateNoWindow = true;

cmdProc.Start();
// ntsd -c q -p [PID] 是早期Windows系统中常用的强制杀进程指令
cmdProc.StandardInput.WriteLine($"ntsd -c q -p {(MyProcess1[0].Id).ToString()}");
cmdProc.StandardInput.WriteLine("Exit");
getProcessInfo(); // 执行后刷新界面

注:ntsd 工具在现代较新的 Windows 版本(如 Win10/11 Pro以上某些版本)中可能已被移除或限制,若环境不支持此命令,建议替换为调用 PowerShell 脚本或使用 Taskkill 命令行工具。

第3步:调整进程优先级

目的:改变操作系统对特定进程的CPU分配策略。

动作:通过 ContextMenuStrip 上下文菜单调用 SetBasePriority 函数,根据预设索引映射到 ProcessPriorityClass 枚举值。

支持的优先级级别:

  • Idle:低(适合后台下载等任务)
  • BelowNormal:低于标准
  • Normal:标准
  • AboveNormal:高于标准
  • High:高
  • RealTime:实时(谨慎使用,可能导致系统卡顿)

实现代码如下:

private void SetBasePriority(int i)
{
    if (listView1.SelectedItems.Count == 0) return;
    
    string ProcessName = listView1.SelectedItems[0].Text;
    Process[] MyProcess = Process.GetProcessesByName(ProcessName);
    
    if (MyProcess.Length > 0)
    {
        try
        {
            switch (i)
            {
                case 0: MyProcess[0].PriorityClass = ProcessPriorityClass.Idle; break;
                case 1: MyProcess[0].PriorityClass = ProcessPriorityClass.Normal; break;
                case 2: MyProcess[0].PriorityClass = ProcessPriorityClass.High; break;
                case 3: MyProcess[0].PriorityClass = ProcessPriorityClass.RealTime; break;
                case 4: MyProcess[0].PriorityClass = ProcessPriorityClass.AboveNormal; break;
                case 5: MyProcess[0].PriorityClass = ProcessPriorityClass.BelowNormal; break;
            }
            getProcessInfo(); // 更新界面显示新优先级
        }
        catch (Exception ex)
        {
            MessageBox.Show("设置优先级失败: " + ex.Message);
        }
    }
}

总结

通过集成 C# 强大的 System.Diagnostics 库,我们快速构建了一个可管理的进程查看器。它不仅展示了如何获取内存和线程等深层数据,还演示了结合系统命令行进行权限突破处理的技巧。开发者可以在此基础上扩展更多功能,如网络端口关联查询或文件路径定位。以上就是利用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 算法库。