Закройте другой процесс, когда приложение закрывается - PullRequest
4 голосов
/ 03 июня 2009

У меня есть приложение C # winform, которое во время своей работы открывает другой процесс Winform. Другой процесс имеет собственный интерфейс. Когда я закрываю родительское приложение, я хочу, чтобы другое приложение было закрыто автоматически.

Как мне этого добиться?

Спасибо

Ответы [ 3 ]

4 голосов
/ 03 июня 2009

Если вы используете Process.Process, существует метод CloseMainWindow. Если вы сохраните ссылку на объект, вы можете использовать его позже.

Вот соответствующая страница в MSDN

и соответствующий код:

// Close process by sending a close message to its main window.
myProcess.CloseMainWindow();
// Free resources associated with process.
myProcess.Close();
3 голосов
/ 03 июня 2009

Есть несколько разных вариантов. Я бы предложил, чтобы ваше приложение отслеживало процессы, которые оно запускает:

private Stack<Process> _startedProcesses = new Stack<Process>();
private void StartChildProcess(string fileName)
{
    Process newProcess = new Process();
    newProcess.StartInfo = new ProcessStartInfo(fileName); ;
    newProcess.Start();    
    _startedProcesses.Push(newProcess);
}

Когда приложение закрывается, вы можете вызвать метод, который закроет все запущенные дочерние процессы, которые все еще работают. Вы можете использовать это либо с методом Kill, либо вызывая методы CloseMainWindow и Close. CloseMainWindow / Close выполнит более изящное закрытие (если вы запустите Notepad, если есть несохраненные изменения, Kill потеряет их, CloseMainWindow / Close заставит блокнот спросить, хотите ли вы сохранить):

private void CloseStartedProcesses()
{
    while (_startedProcesses.Count > 0)
    {
        Process process = _startedProcesses.Pop();
        if (process != null && !process.HasExited)
        {
            process.CloseMainWindow();
            process.Close();
        }
    }
}
1 голос
/ 03 июня 2009

Самый изящный способ сделать это, вероятно, отправить оконное сообщение на главный из другого процесса. Вы можете получить дескриптор этой главной формы, просто используя свойство Process.MainWindow.Handle (я предполагаю, что вы используете класс Process, а затем просто используйте вызов API PostMessage Win для отправки сообщения с пользовательским идентификатором на главную окно этого "дочернего" процесса. Затем цикл обработки сообщений другого процесса может легко обнаружить это сообщение (путем переопределения метода WndProc) и соответственно выполнить надлежащее завершение. Альтернативой может быть отправка стандартного метода WM_CLOSE Это означает, что вам просто нужно будет выгрузить приложение из обработчика события Form.Closed, но, возможно, вам будет предоставлен меньший контроль (над тем, отменять ли завершение работы в определенных ситуациях).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...