Загрузка данных
Добавьте на форму элемент ListView (назовите его listViewProcesses).В свойствах listViewProcesses измените View на Details.Добавьте элемент CheckBox (назовите его checkBoxHideSystem) с текстом «Скрыть системные процессы».Добавьте элемент Button (назовите его btnKill) с текстом «Завершить процесс».Дважды кликните по форме, по кнопке и по чекбоксу, чтобы создать обработчики событий, и вставьте код ниже.Код формы (Form1.cs):
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp5
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
InitListView();
RefreshProcesses();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void listViewProcesses_SelectedIndexChanged(object sender, EventArgs e)
{
}
private void checkBoxHideSystem_CheckedChanged(object sender, EventArgs e)
{
RefreshProcesses();
}
private void btnKill_Click(object sender, EventArgs e)
{
if (listViewProcesses.SelectedItems.Count == 0) return;
var selectedItem = listViewProcesses.SelectedItems[0];
int pid = int.Parse(selectedItem.Text);
string pName = selectedItem.SubItems[1].Text;
if (pid < 100)
{
MessageBox.Show("Критический системный процесс. Завершение запрещено!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
try
{
Process proc = Process.GetProcessById(pid);
if (proc.BasePriority > 8)
{
DialogResult res = MessageBox.Show($"Процесс \"{pName}\" имеет высокий приоритет. Завершение может привести к нестабильности системы. Продолжить?", "Предупреждение", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
if (res == DialogResult.No) return;
}
proc.Kill();
RefreshProcesses();
}
catch (Exception ex)
{
MessageBox.Show($"Не удалось завершить процесс: {ex.Message}", "Ошибка");
}
}
private void InitListView()
{
listViewProcesses.Columns.Clear();
listViewProcesses.Columns.Add("PID", 60);
listViewProcesses.Columns.Add("Имя", 120);
listViewProcesses.Columns.Add("Память (МБ)", 90);
listViewProcesses.Columns.Add("Приоритет", 90);
listViewProcesses.Columns.Add("Время процессора", 120);
listViewProcesses.Columns.Add("Потоки", 70);
}
private void RefreshProcesses()
{
listViewProcesses.Items.Clear();
Process[] processes = Process.GetProcesses();
string currentUser = Environment.UserName;
foreach (Process p in processes)
{
try
{
string pUser = GetProcessUser(p);
if (checkBoxHideSystem.Checked && pUser != currentUser)
{
continue;
}
long memMb = p.WorkingSet64 / (1024 * 1024);
string priorityStr = GetPriorityStr(p.BasePriority);
string cpuTime = "Н/Д";
try { cpuTime = p.TotalProcessorTime.ToString(@"hh\:mm\:ss"); } catch { }
ListViewItem item = new ListViewItem(p.Id.ToString());
item.SubItems.Add(p.ProcessName);
item.SubItems.Add(memMb.ToString());
item.SubItems.Add(priorityStr);
item.SubItems.Add(cpuTime);
item.SubItems.Add(p.Threads.Count.ToString());
listViewProcesses.Items.Add(item);
}
catch
{
if (checkBoxHideSystem.Checked) continue;
ListViewItem item = new ListViewItem(p.Id.ToString());
item.SubItems.Add(p.ProcessName);
item.SubItems.Add("Н/Д");
item.SubItems.Add("Н/Д");
item.SubItems.Add("Н/Д");
item.SubItems.Add("Н/Д");
listViewProcesses.Items.Add(item);
}
}
foreach (ColumnHeader col in listViewProcesses.Columns)
{
col.Width = -2;
}
}
private string GetPriorityStr(int priority)
{
if (priority <= 4) return "Idle";
if (priority <= 8) return "Normal";
if (priority <= 10) return "BelowNormal";
if (priority <= 13) return "AboveNormal";
if (priority <= 15) return "High";
return "Realtime";
}
private string GetProcessUser(Process p)
{
try
{
return p.StartInfo.EnvironmentVariables["USERNAME"] ?? "";
}
catch
{
return "SYSTEM";
}
}
}
}