WPFアプリで特定プロセスを強制停止させる
WPFアプリから、あるカスタムなDOSコマンドを起動して、あるハードウェアを制御しているのだが、そのコマンドが終了しない場合がある。原因はいろいろだが、CTRL+Cに相当する手段をWPFアプリにも設けたい。
当該コマンドはWPFアプリから下記のようにProcess.Startで起動している。
ProcessStartInfo psi = new ProcessStartInfo(); psi.FileName = Environment.GetEnvironmentVariable("ComSpec"); psi.RedirectStandardInput = false; psi.RedirectStandardOutput = true; psi.UseShellExecute = false; psi.CreateNoWindow = true; psi.Arguments = @"/c カスタムDOSコマンド" Process p = Process.Start(psi); string results = p.StandardOutput.ReadToEnd(); p.WaitForExit();
子プロセスをKillすればいいように思えたが、WPFアプリにとっての子はcmd.exeであり、カスタムDOSコマンドではない。また、cmd.exeをKillしてもカスタムDOSコマンドは残ってしまうようだ。
cmd.exeの子プロセスをKillすればいいのだろうが、どうも簡単にはいかないようだ。Performance Counter経由で、あるプロセスの親を探すことはできるようだが、今回は面倒だったので、直接、コマンド名称で終了することにした。
var processes = Process.GetProcessesByName("カスタムDOSコマンド"); int i = 0; for (; i < processes.Length; i++) { processes[i].Kill(); }
もともと当該コマンドは複数起動すべきではないので、今回はこれでいいことにする。うまくいったので、今日はこれで終了!