C # процесс убийства - PullRequest
       24

C # процесс убийства

18 голосов
/ 10 февраля 2010

Мне нужно написать программу на c #, которая будет просто запускаться, уничтожать один процесс \ exe, который он должен уничтожить и завершить сам.

Процесс, который мне нужно убить, это другое приложение на C #, так что это локальный пользовательский процесс, и я знаю путь к exe .

Ответы [ 8 ]

32 голосов
/ 10 февраля 2010

Извлечь Process.GetProcessesByName и Process.Kill

// Get all instances of Notepad running on the local
// computer.
Process [] localByName = Process.GetProcessesByName("notepad");
foreach(Process p in localByName)
{
   p.Kill();
}
18 голосов
/ 10 февраля 2010

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

Process[] runningProcesses = Process.GetProcesses();
foreach (Process process in runningProcesses)
{
    // now check the modules of the process
    foreach (ProcessModule module in process.Modules)
    {
        if (module.FileName.Equals("MyProcess.exe"))
        {
            process.Kill();
        }
    }
}
14 голосов
/ 10 февраля 2010

Процессы уничтожения по их именам могут быть легко выполнены в C # (как и другие ответы уже показали отлично). Однако, если вы хотите уничтожить процессы, основанные на полном пути исполняемых файлов, сделайте их более хитрыми. Один из способов сделать это - использовать WMI, другой способ - использовать Module32First функцию Windows API.

В приведенном ниже примере используется последний подход. Сначала он выбирает подмножество запущенных процессов по их имени, а затем запрашивает у каждого из этих процессов полный путь к исполняемому файлу. Обратите внимание, что этот путь будет фактическим путем исполняемого образа, который не обязательно является исполняемым файлом, который был запущен (например, в системах x64 фактический путь к calc.exe будет C: \ Windows \ SysWOW64 \ calc.exe, даже если файл C: \ Windows \ system32 \ calc.exe был запущен). Все процессы с совпадающим путем возвращаются GetProcessesByPath:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Runtime.ConstrainedExecution;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;

class Program
{
    static void Main(string[] args)
    {
        Process[] processList = GetProcessesByPath(@"C:\Program Files\MyCalculator\calc.exe");
        foreach (var process in processList)
        {
            if (!process.HasExited)
                process.Kill();
        }
    }

    static Process[] GetProcessesByPath(string path)
    {
        List<Process> result = new List<Process>();

        string processName = Path.GetFileNameWithoutExtension(path);
        foreach (var process in Process.GetProcessesByName(processName))
        {
            ToolHelpHandle hModuleSnap = NativeMethods.CreateToolhelp32Snapshot(NativeMethods.SnapshotFlags.Module, (uint)process.Id);
            if (!hModuleSnap.IsInvalid)
            {
                NativeMethods.MODULEENTRY32 me32 = new NativeMethods.MODULEENTRY32();
                me32.dwSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(me32);
                if (NativeMethods.Module32First(hModuleSnap, ref me32))
                {
                    if (me32.szExePath == path)
                    {
                        result.Add(process);
                    }
                }
                hModuleSnap.Close();
            }
        }

        return result.ToArray();
    }
}

//
// The safe handle class is used to safely encapsulate win32 handles below
//
public class ToolHelpHandle : SafeHandleZeroOrMinusOneIsInvalid
{
    private ToolHelpHandle()
        : base(true)
    {
    }

    [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
    protected override bool ReleaseHandle()
    {
        return NativeMethods.CloseHandle(handle);
    }
}
//
// The following p/invoke wrappers are used to get the list of process and modules
// running inside each process.
//
public class NativeMethods
{
    [DllImport("kernel32.dll", SetLastError = true)]
    static public extern bool CloseHandle(IntPtr hHandle);

    [DllImport("kernel32.dll")]
    static public extern bool Module32First(ToolHelpHandle hSnapshot, ref MODULEENTRY32 lpme);

    [DllImport("kernel32.dll")]
    static public extern bool Module32Next(ToolHelpHandle hSnapshot, ref MODULEENTRY32 lpme);

    [DllImport("kernel32.dll")]
    static public extern bool Process32First(ToolHelpHandle hSnapshot, ref PROCESSENTRY32 lppe);

    [DllImport("kernel32.dll")]
    static public extern bool Process32Next(ToolHelpHandle hSnapshot, ref PROCESSENTRY32 lppe);

    [DllImport("kernel32.dll", SetLastError = true)]
    static public extern ToolHelpHandle CreateToolhelp32Snapshot(SnapshotFlags dwFlags, uint th32ProcessID);

    public const short INVALID_HANDLE_VALUE = -1;

    [Flags]
    public enum SnapshotFlags : uint
    {
        HeapList = 0x00000001,
        Process = 0x00000002,
        Thread = 0x00000004,
        Module = 0x00000008,
        Module32 = 0x00000010,
        Inherit = 0x80000000,
        All = 0x0000001F
    }

    [StructLayoutAttribute(LayoutKind.Sequential)]
    public struct PROCESSENTRY32
    {
        public uint dwSize;
        public uint cntUsage;
        public uint th32ProcessID;
        public IntPtr th32DefaultHeapID;
        public uint th32ModuleID;
        public uint cntThreads;
        public uint th32ParentProcessID;
        public int pcPriClassBase;
        public uint dwFlags;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
        public string szExeFile;
    };

    [StructLayoutAttribute(LayoutKind.Sequential)]
    public struct MODULEENTRY32
    {
        public uint dwSize;
        public uint th32ModuleID;
        public uint th32ProcessID;
        public uint GlblcntUsage;
        public uint ProccntUsage;
        IntPtr modBaseAddr;
        public uint modBaseSize;
        IntPtr hModule;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
        public string szModule;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
        public string szExePath;
    };
}

Часть кода основана на статье Джейсона Цандера, которую можно найти здесь .

3 голосов
/ 10 февраля 2010

Вы можете вызвать Process.Kill метод

вы можете использовать Process.GetProcesses , чтобы получить все процессы или Process.GetProcessByName или Process.GetProcessById , чтобы вы могли заставить процесс вызывать Kill .

2 голосов
/ 04 декабря 2013
Process[] processes = Process.GetProcesses();
foreach (Process pr in processes){ 
  if (pr.ProcessName=="vfp")
    if (pr.MainWindowTitle.Contains("test"))
      pr.CloseMainWindow();
}`enter code here`

Здесь vfp - имя процесса.и test - это название заголовка установки.

1 голос
/ 10 февраля 2010

Класс процесса имеет метод Kill ()

1 голос
/ 10 февраля 2010

Вы можете достичь этого, используя Класс процесса класс, но зачем вам убивать другой процесс?

0 голосов
/ 18 марта 2016

Я хотел определить свой собственный список приложений для закрытия, поэтому я сделал это на основе некоторых примеров, которые я видел в списке. Это просто и эффективно.

        string[] Process_name_list = {"chrome","notepad"};
        foreach (string Process_name in Process_name_list)
        {
            foreach (var process in Process.GetProcessesByName(Process_name))
            {                    
                process.Kill();
            }
        }
...