如何通过C#杀掉指定进程?

咨询区

  • robr

我用代码动态的打开了一个 IE 进程,参考如下代码:

static void Main(string[] args)
{
    ProcessStartInfo startInfo = new ProcessStartInfo("iexplore.exe");
    startInfo.WindowStyle = ProcessWindowStyle.Hidden;
    startInfo.Arguments = "http://www.google.com";
    Process ieProcess = Process.Start(startInfo);
}

代码运行后,在 任务管理器 上会有两个进程,现在我尝试通过下面的方法去 kill 它。.

ieProcess.Kill();

我发现 kill 不干净,应该是这个进程的附属子进程无法被销毁,请问这种情况我该如何去处理呢?

回答区

  • Cyprien Autexier

如果 kill 主进程之后,让附属的子进程也可以自动销毁的话,大概有2种解决办法。

  1. 使用 ManagementObjectSearcher

通过指定的 pid 获取所有进程(包括子进程),再进行统一 kill,参考如下代码:

/// <summary>
/// Kill a process, and all of its children, grandchildren, etc.
/// </summary>
/// <param name="pid">Process ID.</param>
private static void KillProcessAndChildren(int pid)
{
    // Cannot close 'system idle process'.
    if (pid == 0)
    {
        return;
    }
    ManagementObjectSearcher searcher = new ManagementObjectSearcher
            ("Select * From Win32_Process Where ParentProcessID=" + pid);
    ManagementObjectCollection moc = searcher.Get();
    foreach (ManagementObject mo in moc)
    {
        KillProcessAndChildren(Convert.ToInt32(mo["ProcessID"]));
    }
    try
    {
        Process proc = Process.GetProcessById(pid);
        proc.Kill();
    }
    catch (ArgumentException)
    {
        // Process already exited.
    }
}
  1. process.kill(true) 方式

如果你是 .NET Core 3.0 以上的项目,在框架中已经内置了 boolean 类型的 Kill 方法重载,签名如下:

        //
        // Parameters:
        //   entireProcessTree:
        //     true to kill the associated process and its descendants; false to kill only the
        //     associated process.
        //
        public void Kill(bool entireProcessTree);

然后就可以再改造一下。

        static void Main(string[] args)
        {
            ProcessStartInfo startInfo = new ProcessStartInfo("iexplore.exe");
            startInfo.WindowStyle = ProcessWindowStyle.Hidden;
            startInfo.Arguments = "http://www.google.com";
            Process ieProcess = Process.Start(startInfo);

            ieProcess.Kill(true);
        }

点评区

Kill方法重载的这个很不错,框架越来越强大,学习了。