C # закрывает дочернее приложение, когда его родительское приложение закрывается - PullRequest
1 голос
/ 21 ноября 2011

Я хочу закрыть вспомогательное приложение (которое является fileViewer: Window), когда его отдельное приложение будет закрыто.

Примечание: это отдельное приложение не является Основным приложением.

Это означает, что у меня есть приложение winform C #, имеющее 3 уровня.

Первое - Основное приложение, Второе - ПодприложениеОсновное третье приложение - это вспомогательное приложение второго

Когда я закрываю второе приложение, я хочу, чтобы третье приложение автоматически закрывалось.

Этот поток Закрытие другого процесса при закрытии приложения довольно полезен, но я не знаю, куда звонить process.close() или fileViewer.FileBrowser.Dispose(); и т. Д.

public void OpenNewInstanceOf2nd()
{
    //Use .NET Diagnostics to start a new process off the 2nd
    try
    {
        System.Diagnostics.Process.Start(MyFramework.FileSystem.ApplicationPath + MyProperties.MyAssemblyName);
    }
    catch (Exception ex)
    {
        MyFramework.Debug.LogException(ex, "Could not open the My Utility");
    }
}

Ответы [ 2 ]

3 голосов
/ 21 ноября 2011

Если это просто форма, которую вы хотите закрыть, вы можете установить владельца формы 3 на форму 2. Если вы закроете форму 2, форма 3 также закроется.

private void Form2nd_Load(object sender, EventArgs e)
{
  Form3rd form_3rd = new Form3rd();
  form_3rd.Show(this);
}

Если это вложенный процесс / рабочий поток, почему бы вам просто не сохранить ссылку во 2-й форме / приложении и удалить ее, если ваше 2-е приложение закрывается?

2 голосов
/ 21 ноября 2011

Если я правильно понимаю ваш вопрос, у вас есть 3 разных процесса, где последние два были созданы предыдущими:

Proc1> Proc2> Proc3

Первое, что я хочу спросить у вас, действительно ли вам нужна такая настройка. Если все находится под вашим контролем, вы должны рассмотреть возможность создания одного процесса, но если по какой-то причине вам действительно нужно это сделать (т.е. вам нужно запустить другие утилиты командной строки), давайте перейдем к ...

Если вы создаете «дочерние» процессы в своем коде, вы можете сохранить ссылку:

Process proc2 = Process.Start("proc2.exe");

и затем закройте процесс:

proc2.CloseMainWindow();
proc2.Close();

Если у вас нет контроля над Proc2, вы можете получить ссылку на Proc3 из Proc1, используя

Process.GetProcessesByName("proc3.exe");

Имейте в виду, что Process.CloseMainWindow () работает только с приложениями, у которых есть окно, но бесполезно для утилит командной строки. Управлять другими сторонними процессами может быть сложно, это действительно зависит от того, как они реализованы, поэтому я не могу быть более конкретным.


После подробностей в комментарии я бы добавил следующее: если вы запускаете Proc2 из своего собственного кода, у вас может быть ссылка на его объект Process, так что вы можете зарегистрироваться в событии Exited и в этой точке найти и закрыть Proc3:

proc2 = Process.Start("HelpViewer.exe");
proc2.Exited += new EventHandler(proc2_Exited);
proc2.EnableRaisingEvents = true;


void proc2_Exited(object sender, EventArgs e)
{
    //Unregister the event and free the object resources
    proc2.Exited -= new EventHandler(proc2_Exited);
    proc2.Close();

    //Search and close the other process(es)
    Process[] processes = Process.GetProcessesByName("HelpViewer.exe");
    foreach(Process process in processes)
        process.CloseMainWindow();
}

Если вы не запускаете Proc2 из своего кода, то нет простого решения.

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