Грязным, но рабочим способом будет опрос текущих запущенных процессов с помощью таймера, сравнивая список с процессами, которые выполнялись в предыдущем проведенном вами опросе.
Сначала добавьте такой член класса для хранения процессов для последующего сравнения:
List<string> lastRunningProcesses = new List<string>();
Тогда для начала опроса есть такой код:
System.Timers.Timer timer = new System.Timers.Timer();
timer.Interval = 500; //half a second
timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
timer.Start();
И, наконец, это код опроса и сравнения:
void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
List<string> currentlyRunningProcesses = System.Diagnostics.Process.GetProcesses().ToList().ConvertAll(p => p.ProcessName);
if (lastRunningProcesses.Count > 0)
{
List<string> closedProcesses = lastRunningProcesses.FindAll(p => !currentlyRunningProcesses.Contains(p));
if (closedProcesses.Count > 0)
MessageBox.Show(string.Format("{0} process(es) have been closed:\n{1}", closedProcesses.Count, string.Join("\n", closedProcesses)));
}
lastRunningProcesses = currentlyRunningProcesses;
}
Пока ваше приложение будет работать, оно будет продолжать опрос.