/*метод, запускающий процесс на сиполнение и * сохраняющий объект, который его описывает*/ void RunProcess(string AssamblyName) { //запускаем процесс на соновании ичполняемого файла Process proc = Process.Start(AssamblyName); //добавляем процесс в список Processes.Add(proc); /*проверяем, стал ли созданный процесс дочерним, * по отношению к текущему и, если стал, выводим MessageBox*/ if (Process.GetCurrentProcess().Id == GetParentProcessId(proc.Id)) { MessageBox.Show(proc.ProcessName + " действительно дочерний процесс текущего процесса!"); } /*указываем, что процесс должен генерировать собития*/ proc.EnableRaisingEvents = true; //добавляем обработчик на событие завершения процесса proc.Exited += proc_Exited; /*устанавливаем новый текст главному окну дочернего процесса*/ SetChildWindowText(proc.MainWindowHandle, "Chils process #" + (++Counter)); /*проверяем, запускали ли мы экземпляр такого приложения * и, елси нет, то добавляем в список запущенных приложений*/ StartedAssemblies.Invoke((Action) delegate() { if (!StartedAssemblies.Items.Contains(proc.ProcessName)) { StartedAssemblies.Items.Add(proc.ProcessName); } }); /*убираем приложение из списка лдоступных приложений*/ AvailableAssemblies.Invoke((Action) delegate() { AvailableAssemblies.Items.Remove(AvailableAssemblies.SelectedItem); }); }
/*обработчик события нажания на кнопку Refresh основного диалога*/ private void Refresh_Click(object sender, EventArgs e) { string temp = null; StartedAssemblies.Invoke((Action) delegate() { temp = StartedAssemblies.SelectedItem.ToString(); }); ExecuteOnProcessesByName(temp, Refresh); }
/*обработчик события нажания на кнопку Close основного диалога*/ private void CloseWindowButton_Click(object sender, EventArgs e) { string temp = null; StartedAssemblies.Invoke((Action) delegate() { temp = StartedAssemblies.SelectedItem.ToString(); }); ExecuteOnProcessesByName(temp, CloseMainWindow); StartedAssemblies.Invoke((Action) delegate() { StartedAssemblies.Items.Remove(StartedAssemblies.SelectedItem); }); }
/*обработчик события Exited класса Process*/ void proc_Exited(object sender, EventArgs e) { Process proc = sender as Process; //убираем процесс из списка запущенных приложений StartedAssemblies.Invoke((Action) delegate() { StartedAssemblies.Items.Remove(proc.ProcessName); }); //добавляем процесс в список доступных приложений AvailableAssemblies.Invoke((Action) delegate() { AvailableAssemblies.Items.Add(proc.ProcessName); }); //убираем процесс из списка дочерних процессов Processes.Remove(proc); //уменьшаем счётчик дочерних процессов на 1 Counter--; int index = 0; /*меняем текст для главных окон всех дочерних процессов*/ foreach (var p in Processes) { SetChildWindowText(p.MainWindowHandle, "Child process #" + ++index); } }