2010-02-10 2 views
17

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

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

+1

«цифровое убийство, язык машин» –

ответ

18

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

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(); 
     } 
    } 
} 
+2

Если вы уже знаете название процесса, нет необходимости цитировать все процессы. См. Ответ, отправленный @ SwDevMan81. –

+1

Говорят, что он знает путь exe, а не название процесса. В противном случае вы абсолютно правы. –

+1

И даже если вы знаете имя, что, если работает несколько экземпляров? Или что, если две разные программы имеют одно и то же имя? –

1

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

1

класс процессов имеет метод убийств()

14

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

В приведенном ниже примере используется последний подход. Сначала он выбирает подмножество запущенных процессов по их имени и затем запрашивает каждый из этих процессов для их полного исполняемого пути. Обратите внимание, что этот путь будет фактическим путем исполняемого образа, который не обязательно является исполняемым, который был запущен (например, в системах 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; 
    }; 
} 

Часть кода основана на статье Джейсон Зандер, который можно найти here.

2
Process[] processes = Process.GetProcesses(); 
foreach (Process pr in processes){ 
    if (pr.ProcessName=="vfp") 
    if (pr.MainWindowTitle.Contains("test")) 
     pr.CloseMainWindow(); 
}`enter code here` 

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

0

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

 string[] Process_name_list = {"chrome","notepad"}; 
     foreach (string Process_name in Process_name_list) 
     { 
      foreach (var process in Process.GetProcessesByName(Process_name)) 
      {      
       process.Kill(); 
      } 
     } 
Смежные вопросы