Division By Zero

ゼロで割る

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

もともと当該コマンドは複数起動すべきではないので、今回はこれでいいことにする。うまくいったので、今日はこれで終了!