C# WinForms实现简易进程管理器:查看、终止与优先级调整
如何利用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步:执行进程终止操作
目的:允许用户安全地退出特定应用程序,并在权限受阻时提供强力手段。
操作路径:选中某一行 → 右键点击 → 选择 “结束进程”。首先会弹出确认对话框以防误操作。
逻辑判断:
- 常规模式:调用
Process.Kill()。如果成功,立即调用刷新方法更新列表。 - 权限拒绝/异常模式:如果上述方法抛出异常,通常意味着需要更高权限或进程处于特殊锁定状态。此时触发备用方案:启动命令提示符并使用
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#系统编程与进程控制的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













