这对我来说非常有效:
/// <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.
}
}
2016-04-26 更新
Visual Studio 2015 Update 2
在上测试Win7 x64
。现在仍然像 3 年前一样有效。
2017-11-14 更新
添加了对系统空闲进程的检查if (pid == 0)
2018-03-02 更新
需要添加对System.Management
命名空间的引用,请参阅下面@MinimalTech 的评论。如果您安装了 ReSharper,它会自动为您执行此操作。
2018 年 10 月 10 日更新
最常见的用例是杀死我们自己的 C# 进程已启动的任何子进程。
在这种情况下,更好的解决方案是在 C# 中使用 Win32 调用来使任何衍生进程成为子进程。这意味着当父进程退出时,任何子进程都会被 Windows 自动关闭,这样就不需要上面的代码了。如果您希望我发布代码,请告诉我。