В общем, есть нужда, при каждом открытии диспетчера задач, убивать процесс Taskmgr, то бишь сам диспетчер. Я пытался сделать бесконечный цикл запуска метода, в котором реализовал его закрытие, но происходит утечка памяти и программа крашится(очевидно). Я понимаю, что нужно сделать метод отслеживания того, запущен ли сейчас данный процесс, но я не могу найти примеров, чтобы это можно было совместить с автозакрытием. Есть какие ни будь идеи? public static void CloseProcess(string processName) { Process[] processes = Process.GetProcessesByName(processName); foreach (Process process in processes) { try { process.CloseMainWindow(); process.WaitForExit(); } catch (Exception ex) { Console.WriteLine("Ошибка при закрытии процесса " + processName + ": " + ex.Message); } } } CSHARP public static void CloseProcess(string processName) { Process[] processes = Process.GetProcessesByName(processName); foreach (Process process in processes) { try { process.CloseMainWindow(); process.WaitForExit(); } catch (Exception ex) { Console.WriteLine("Ошибка при закрытии процесса " + processName + ": " + ex.Message); } } } Вот, на мой взгляд реализация метода закрытия, но нужно сделать постоянную проверку, на то, открыт ли Taskmgr.exe в реальном времени.
Если действовать узконаправленно, то можно обойтись и без бесконечного мониторинга процессов, например отключить диспетчер задач при помощи реестра и редактора групповой политики, пример реализации: https://stackoverflow.com/questions/2971097/programmatically-disabling-taskmanager-using-c-sharp Если хочется убивать что-то помимо диспетчера, можно условно создать ивент, который будет срабатывать при запуске необходимого процесса. Например так. using System.Diagnostics; using System.Management; namespace ProcessStartEvent { internal class Program { static void Main(string[] args) { CreateEventWatcher("taskmgr"); Console.ReadLine(); } static void CreateEventWatcher(string ProcessName) { string Query = "SELECT TargetInstance " + "FROM __InstanceCreationEvent WITHIN 1 " + "WHERE TargetInstance ISA 'Win32_Process'" + $" AND TargetInstance.Name LIKE '{ProcessName}.exe'"; using (ManagementEventWatcher Watcher = new ManagementEventWatcher(Query)) { Watcher.EventArrived += new EventArrivedEventHandler((object sender, EventArrivedEventArgs e) => KillProcess(ProcessName)); Watcher.Start(); } } static void KillProcess(string ProcessName) => Process.GetProcessesByName(ProcessName)[0].Kill(); } } CSHARP using System.Diagnostics; using System.Management; namespace ProcessStartEvent { internal class Program { static void Main(string[] args) { CreateEventWatcher("taskmgr"); Console.ReadLine(); } static void CreateEventWatcher(string ProcessName) { string Query = "SELECT TargetInstance " + "FROM __InstanceCreationEvent WITHIN 1 " + "WHERE TargetInstance ISA 'Win32_Process'" + $" AND TargetInstance.Name LIKE '{ProcessName}.exe'"; using (ManagementEventWatcher Watcher = new ManagementEventWatcher(Query)) { Watcher.EventArrived += new EventArrivedEventHandler((object sender, EventArrivedEventArgs e) => KillProcess(ProcessName)); Watcher.Start(); } } static void KillProcess(string ProcessName) => Process.GetProcessesByName(ProcessName)[0].Kill(); } }
wDude, при попытке убить диспетчер через реестр, ловлю эксепш связаный с запретом на редактирование, хотя все делаю с правами админа.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApp2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { var timer = new System.Windows.Forms.Timer(); timer.Interval = 1000; timer.Tick += new EventHandler((s, ev) => { var taskmgrProcesses = Process.GetProcessesByName("Taskmgr"); if (taskmgrProcesses.Length > 0) { foreach (var process in taskmgrProcesses) { process.Kill(); } } }); timer.Start(); } } } CSHARP using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApp2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { var timer = new System.Windows.Forms.Timer(); timer.Interval = 1000; timer.Tick += new EventHandler((s, ev) => { var taskmgrProcesses = Process.GetProcessesByName("Taskmgr"); if (taskmgrProcesses.Length > 0) { foreach (var process in taskmgrProcesses) { process.Kill(); } } }); timer.Start(); } } } Вот написал по бырику ( да код калич за 5 секунд сорри просто пример показать, но ворк )