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
相关产品推荐
相关产品推荐

