これは私にとって非常にうまくいきました:
/// <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年4月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によって自動的に閉じられることを意味します。これにより、上記のコードが不要になります。コードを投稿してほしい場合はお知らせください。