系統管理工具常需列舉執行中處理序並顯示詳細資訊。本文提供完整 WinForms 範例:ListBox 顯示處理序名稱、選取後在 Label 群組顯示詳細屬性。
using System.Diagnostics;
// 取得所有處理序
Process[] processes = Process.GetProcesses();
// 依名稱取得處理序陣列
Process[] notepads = Process.GetProcessesByName("notepad");
listBox1:顯示處理序名稱清單groupBox1:標題顯示選中處理序名稱label1~label14:顯示各項詳細屬性
private void LoadProcessList()
{
listBox1.Items.Clear();
Process[] processes = Process.GetProcesses();
foreach (Process p in processes)
{
listBox1.Items.Add(p.ProcessName);
}
if (listBox1.Items.Count > 0)
listBox1.SelectedIndex = 0;
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
try
{
string processName = listBox1.Text;
groupBox1.Text = $"{processName} 處理序詳細資訊";
Process[] processes = Process.GetProcessesByName(processName);
if (processes.Length == 0) return;
Process p = processes[0]; // 取第一個同名處理序
label1.Text = $"處理序映像名:{p.ProcessName}";
label2.Text = $"處理序 ID:{p.Id}";
label3.Text = $"執行緒數:{p.Threads.Count}";
label4.Text = $"CPU 時間:{p.TotalProcessorTime}";
label5.Text = $"優先序類別:{p.PriorityClass}";
label6.Text = $"啟動時間:{p.StartTime:yyyy/MM/dd HH:mm:ss}";
// 記憶體相關 (單位轉換為 KB)
label7.Text = $"專用記憶體:{p.PrivateMemorySize64 / 1024:N0} KB";
label8.Text = $"峰值虛擬記憶體:{p.PeakVirtualMemorySize64 / 1024:N0} KB";
label9.Text = $"峰值分頁記憶體:{p.PeakPagedMemorySize64 / 1024:N0} KB";
label10.Text = $"分頁系統記憶體:{p.PagedSystemMemorySize64 / 1024:N0} KB";
label11.Text = $"分頁記憶體:{p.PagedMemorySize64 / 1024:N0} KB";
label12.Text = $"非分頁系統記憶體:{p.NonpagedSystemMemorySize64 / 1024:N0} KB";
label13.Text = $"工作集 (物理記憶體):{p.WorkingSet64 / 1024:N0} KB";
label14.Text = $"虛擬記憶體:{p.VirtualMemorySize64 / 1024:N0} KB";
}
catch (Exception ex)
{
MessageBox.Show($"無法取得處理序資訊:{ex.Message}", "錯誤",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
| 屬性 | 說明 | 單位/型別 |
|---|---|---|
| ProcessName | 處理序名稱 (不含 .exe) | string |
| Id | 處理序識別碼 (PID) | int |
| Threads | 執行緒集合 | ProcessThreadCollection |
| TotalProcessorTime | 總 CPU 使用時間 | TimeSpan |
| PriorityClass | 優先序類別 | ProcessPriorityClass |
| StartTime | 啟動時間 | DateTime |
| PrivateMemorySize64 | 專用記憶體 (不可共享) | long (bytes) |
| VirtualMemorySize64 | 虛擬記憶體大小 | long (bytes) |
| WorkingSet64 | 物理記憶體工作集 | long (bytes) |
| PagedMemorySize64 | 分頁記憶體 | long (bytes) |
| NonpagedSystemMemorySize64 | 非分頁系統記憶體 | long (bytes) |
| PeakVirtualMemorySize64 | 峰值虛擬記憶體 | long (bytes) |
| PeakPagedMemorySize64 | 峰值分頁記憶體 | long (bytes) |
| PagedSystemMemorySize64 | 分頁系統記憶體 | long (bytes) |
System, csrss) 部分屬性需管理員權限,建議 try-catch 處理Xxx64 版本屬性 (PrivateMemorySize64),避免 32 位元溢位GetProcessesByName 回傳陣列,Chrome 等多處理序架構會有多個項目GetProcesses() 會建立快照,頻繁呼叫有開銷,建議快取或計時器週期性更新:N0
private async Task MonitorProcessAsync(string processName, TimeSpan interval)
{
while (true)
{
var processes = Process.GetProcessesByName(processName);
if (processes.Length > 0)
{
var p = processes[0];
Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] {processName} " +
$"CPU: {p.TotalProcessorTime} | RAM: {p.WorkingSet64 / 1024 / 1024} MB");
}
else
{
Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] {processName} 未執行");
}
await Task.Delay(interval);
}
}
Process.GetProcesses 系列 API 提供完整的處理序列舉與檢查能力。配合 WinForms/UI 顯示,可快速建構工作管理員類工具。關鍵在於正確處理權限例外、使用 64 位元記憶體屬性、單位轉換與格式化顯示。