まず、プロセスの開始パスを保持するために独自の Process Wrapper を使用しています。
public class MCProcess()
{
public Process Process { get; set;}
public string StartingPath { get; set;}
public MCProcess(string start, Process p)
{
Process = p;
StartingPath = start;
}
}
これで、List<MCProcces>
すべてのプロセスと、プログラムが開始したすべてのプロセスの開始パスを追跡するために使用する runningProcesses が呼び出されます。
例えば:
string path = "C:\\Windows\\System32\\notepad.exe";
Process temp = Process.Start(path);
runningProcesses.Add(new MCProcess(path, temp));
今、時々、実行したプロセスを閉じたいと思うことがあります。タスク マネージャーを調べて、開始した各プロセスの MainModuleName を見つけようとする代わりに、理由があって StartingPath を含めました。
メモ帳を閉じたい場合は、runningProcesses をループして、メモ帳の startingPath を持つプロセスを見つけ、Process.Kill を使用してそのプロセスを強制終了します。
string path = "C:\\Windows\\System32\\notepad.exe";
for (int i = 0; i < runningProcesses.Count; i++)
{
if (runningProcesses[i].StartingPath == path)
{
runningProcesses[i].Process.Kill();
runningProcesses.RemoveAt(i);
}
}
このコードは Windows 7 でうまく動作し、まったく問題はありませんでした。ただし、これを Windows XP で使用すると、Process.Kill で ArgumentNullException が発生します。
Process クラスについて、Windows XP でうまく動作しない理由はありますか?