Как программно открыть приложение и проверить, когда оно закрыто? - PullRequest
2 голосов
/ 14 июня 2011

Мне удалось использовать приложение winforms, чтобы открыть другое приложение winforms, используя:

Rhino4.Application oRhino = (Rhino4.Application) Activator.CreateInstance (Type.GetTypeFromProgID ("Rhino4.Application"));

Но как я могу проверить, закрывается ли он? Можно ли создать событие, которое будет срабатывать, когда пользователь закрывает приложение?

EDIT

Process[] pr = Process.GetProcessesByName("Rhino4");


                for (int i = 0; i < pr.Length; i++)
                {


                    if (pr[i].MainWindowTitle != null)
                    {
                        if (pr[i].MainWindowTitle.Length > 4)
                        {
                            if (pr[i].MainWindowTitle.Substring(0, 4) == "wall")
                            {
                                pr[i].Exited += new EventHandler(caseInfoMenu_Exited);

                            }
                        }
                    }

                }


void caseInfoMenu_Exited(object sender, EventArgs e)
        {
            MessageBox.Show("Window closed");
        }

Мне удалось идентифицировать процесс, используя этот код. Но событие Exited не срабатывает, когда я закрываю программу.

Ответы [ 3 ]

3 голосов
/ 14 июня 2011

Возможно, это не самое элегантное решение, но косвенно вы можете сделать это, проверив, существует ли процесс или нет, а затем сделайте это повторяемым.Это, конечно, если у вас еще нет дескриптора процесса.

void checkProcess()
{
    Process[] processes = Process.GetProcessesByName("NameOfProcess");
    if (processes.Length == 0)
    {
         // No such process
    }
    else
    {
         foreach (Process proc in processes)
         {
            // do something with proc
         }
    }
}

Изменить: Некоторые мысли по этому поводу после прочтения постов в ответ Абдул плюс ваш собственный вопрос.Это ни в коем случае не ответ, но, возможно, он может помочь вам в ваших поисках.

Во-первых, Activator.CreateInstance вызывает конструктор наилучшего соответствия для типа объекта, который вы ему передаете, и возвращает дескриптор этого объекта.Он сам создает потоки / процессы и поэтому не знает о них.(9) процессы, которые вы увидите в своем списке, вероятно, созданы самим классом Rheno4.Здесь обсуждается здесь .

Во-вторых, согласно msdn свойство EnableRaisingEvents должно быть установлено в значение true, когда процесс создается для события Exited для функционированияправильно.Это заставляет меня задуматься о том, что происходит, когда вы присоединяете событие после того, как процесс уже создан?

Конечно, вы можете перебирать все соответствующие процессы до и после вызова CreateInstance, чтобы извлечь все новые экземпляры Rheno4, которые были созданы.Но это далеко не пуленепробиваемое решение, и есть риск, что вы выбираете процессы, созданные кем-то другим, или что не все процессы извлекаются (в случае задержки при создании другого объекта).Однако в зависимости от ваших потребностей это может быть применимо.

Еще одна мысль.Процессы, возвращаемые из GetProcessesByName, имеют богатый набор свойств .Может быть, вы можете посмотреть через них и найти общий знаменатель для возвращаемых процессов.Те, которые я бы начал исследовать: Threads, StartInfo, MainModule.

2 голосов
/ 14 июня 2011

Как насчет перехвата Exited события

myProcess.Exited += new EventHandler(myProcess_Exited);



private void myProcess_Exited(object sender, System.EventArgs e)
    {

        eventHandled = true;
        Console.WriteLine("Exit time:    {0}\r\n" +
            "Exit code:    {1}\r\nElapsed time: {2}", myProcess.ExitTime, myProcess.ExitCode, elapsedTime);
    }

Источник msdn .

0 голосов
/ 14 июня 2011

Если вы хотите снова запустить приложение после закрытия, то: - Я думаю, вам нужно создать службу Windows, которая будет продолжать проверять запущенный процесс, и если он будет закрыт, запустите приложение снова

Насколькочто касается событий, то в приложении Windows есть события «Закрытие» и «Закрытие», которые запускаются, когда пользователь закрывает приложение.

...