Любой язык на это способен :-)
В
C# работа с процессами может быть примерно такой:
// запускаем процесс
var process = System.Diagnostics.Process.Start(@"C:\windows\system32\calc.exe");
// убиваем процесс
process.Kill();
// или отправляем команду на закрытие главного окна
// process.CloseMainWindow();
// запуск можно выполнить через ProcessStartInfo,
// это может быть более удобней и больше возможностей
var processStartInfo = new System.Diagnostics.ProcessStartInfo();
// путь к файлу программы
processStartInfo.FileName = @"C:\windows\system32\notepad.exe";
// передаем аргументы (в данном случае путь файла для открытия)
processStartInfo.Arguments = @"C:\Windows\System32\drivers\etc\hosts";
// запускаем процесс
var process2 = System.Diagnostics.Process.Start(processStartInfo);
// если необходимо, можем получить список всех процессов
var processes = System.Diagnostics.Process.GetProcesses();
// для примера, выводим в консоль
foreach(var p in processes)
{
Console.WriteLine("PID#{0}, {1}", p.Id, p.ProcessName);
// можем поубивать все блокноты
// if (p.ProcessName == "notepad")
// {
// p.Kill();
// }
}
При запуске процессов, вы можете просто запомнить их идентификаторы (например в коллекцию, типа
List<int> или же использовать свой тип, и/или запоминать экземпляры
Process) и в последующем завершить работу этих процессов.
Информацию о запущенных процессах можно получать с помощью методов:
System.Diagnostics.Process.GetProcessById() - по идентификатору процесса,
System.Diagnostics.Process.GetProcessByName() - по имени процесса.
Если необходимо, к каждому создаваемому процессу можно подключить обработчик завершения работы процесса:
// создаем параметры запуска процесса
var processStartInfo = new System.Diagnostics.ProcessStartInfo();
processStartInfo.FileName = @"C:\windows\system32\notepad.exe";
processStartInfo.Arguments = @"C:\Windows\System32\drivers\etc\hosts";
// создаем экземпляр процесса
var process = new System.Diagnostics.Process();
// передаем параметры
process.StartInfo = processStartInfo;
// разрешаем использование обработчиков событий
process.EnableRaisingEvents = true; // <-- требуется для работы обработчика завершения процесса
// цепляем обработчик завершения работы процесса
// (лучше сделать нормальную функцию, а не анонимную, как показано в примере)
process.Exited += (object sender, EventArgs e) =>
{
// этот блок будет выполнен, когда работа процесса будет завершена
// экземпляр процесса можно найти в sender: строгий тип - ((System.Diagnostics.Process)sender)
// (хотя в данном примере без проблем можно использовать process, это будет даже удобней)
// для примера, выводим в консоль идентификатор завершенного процесса
Console.WriteLine("PID#{0} завершил работу", ((System.Diagnostics.Process)sender).Id);
};
// запускаем процесс
process.Start();