You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#:在ListBox显示运行进程并终止,解决显示格式异常问题

解决C# ListBox进程显示格式问题并完善终止功能

问题根源

你原来的代码直接把Process对象转成字符串添加到ListBox,而默认的Process.ToString()方法会输出System.Diagnostics.Process(app.exe)这种格式,这就是显示不符合预期的原因。我们需要让ListBox显示进程的文件名(比如app.exe),同时还要能准确终止选中的进程。

修正显示格式的推荐方案

我更推荐存储Process对象+自定义显示格式的方式,这样既能显示正确的文件名,又能直接通过选中的对象操作进程,避免同名进程误杀的问题。

实现代码(Form加载时)

using System.IO;
using System.Diagnostics;

private void Form1_Load(object sender, EventArgs e)
{
    // 开启ListBox的格式化功能
    listBox1.FormattingEnabled = true;
    // 绑定Format事件,自定义显示内容
    listBox1.Format += ListBox1_Format;

    Process[] prs = Process.GetProcesses();
    foreach (Process pr in prs)
    {
        try
        {
            // 部分系统进程无法访问MainModule,用try-catch跳过这类进程
            listBox1.Items.Add(pr);
        }
        catch
        {
            continue;
        }
    }
}

private void ListBox1_Format(object sender, ListControlConvertEventArgs e)
{
    if (e.ListItem is Process pr)
    {
        try
        {
            // 提取带.exe的文件名(比如app.exe)
            e.Value = Path.GetFileName(pr.MainModule.FileName);
        }
        catch
        {
            // 如果无法获取完整文件名,退而求其次显示进程名(不带.exe)
            e.Value = pr.ProcessName;
        }
    }
}

完善进程终止功能

核心是拿到选中的Process对象,调用Kill()方法终止进程,同时处理异常和边界情况:

private void button3_Click(object sender, EventArgs e)
{
    // 判断选中项是否为Process对象
    if (listBox1.SelectedItem is Process selectedProcess)
    {
        try
        {
            // 先检查进程是否还在运行
            if (!selectedProcess.HasExited)
            {
                selectedProcess.Kill();
                // 终止后从ListBox移除该进程
                listBox1.Items.Remove(selectedProcess);
                MessageBox.Show($"已成功终止进程: {Path.GetFileName(selectedProcess.MainModule.FileName)}");
            }
            else
            {
                MessageBox.Show("该进程已经退出");
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show($"终止进程失败: {ex.Message}");
        }
    }
    else
    {
        MessageBox.Show("请先选中一个进程");
    }
}

注意事项

  • 必须添加两个命名空间:using System.IO;和using System.Diagnostics;
  • 系统核心进程无法被终止,也可能无法访问其MainModule,所以一定要用try-catch处理异常
  • 如果需要定时刷新进程列表,可以把加载进程的代码抽成独立方法,比如RefreshProcessList(),方便重复调用

内容的提问来源于stack exchange,提问作者Aatroxon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:44:34