Загрузка...

Закрытие процесса при его открытии?

Тема в разделе C# создана пользователем JanitorHvhboom 15 авг 2023. 181 просмотр

Загрузка...
  1. JanitorHvhboom
    JanitorHvhboom Автор темы 15 авг 2023 хочу работать. 32 4 апр 2018
    В общем, есть нужда, при каждом открытии диспетчера задач, убивать процесс Taskmgr, то бишь сам диспетчер. Я пытался сделать бесконечный цикл запуска метода, в котором реализовал его закрытие, но происходит утечка памяти и программа крашится(очевидно). Я понимаю, что нужно сделать метод отслеживания того, запущен ли сейчас данный процесс, но я не могу найти примеров, чтобы это можно было совместить с автозакрытием. Есть какие ни будь идеи?

    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 в реальном времени.
     
  2. wDude
    wDude 16 авг 2023 Боюсь быть не там и не тем. 3667 14 авг 2017
    Если действовать узконаправленно, то можно обойтись и без бесконечного мониторинга процессов, например отключить диспетчер задач при помощи реестра и редактора групповой политики, пример реализации: https://stackoverflow.com/questions/2971097/programmatically-disabling-taskmanager-using-c-sharp

    Если хочется убивать что-то помимо диспетчера, можно условно создать ивент, который будет срабатывать при запуске необходимого процесса.

    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();
    }
    }
     
    16 авг 2023 Изменено
    1. JanitorHvhboom Автор темы
      wDude, при попытке убить диспетчер через реестр, ловлю эксепш связаный с запретом на редактирование, хотя все делаю с правами админа.
  3. Nepoladka_inactive4430253
    Nepoladka_inactive4430253 16 авг 2023 Заблокирован(а) 139 20 авг 2021
    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 секунд сорри просто пример показать, но ворк )
     
    16 авг 2023 Изменено
Top