如何用程序打开应用程序并检查它';s已关闭

本文关键字:检查 程序 何用 应用程序 | 更新日期: 2023-09-27 17:59:01

我已经能够使用一个winforms应用程序打开另一个winform应用程序,使用:

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

但我该如何检查它是否关闭?是否可以创建一个在用户关闭应用程序时会被触发的事件?

编辑

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事件不会启动。

如何用程序打开应用程序并检查它';s已关闭

这可能不是最优雅的解决方案,但您可以通过检查流程是否存在来间接地做到这一点,然后重复执行。当然,如果您还没有这个过程的句柄的话。

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,当为Exited事件正确运行创建进程时,EnableRaisingEvents属性应设置为true。这让我想知道,在流程创建后附加事件会发生什么?

当然,您可以在调用CreateInstance之前和之后迭代所有匹配的进程,以提取已创建的Rheno4的所有新实例。但这远不是一个防弹的解决方案,风险在于您正在获取其他人创建的进程,或者并非所有进程都被检索(以防创建其他对象时出现延迟)。然而,根据您的需要,这可能是适用的。

另一个想法。从GetProcessesByName返回的进程具有一组丰富的属性。也许您可以查看这些,并为返回的进程找到一个共同点。我将开始研究的是:线程、StartInfo、MainModule。

捕获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。

如果您想在关闭后再次启动应用程序,那么:-我认为你需要创建一个Windows服务,它将不断检查进程的运行,如果它关闭了,然后再次启动应用程序

就事件而言,Windows应用程序中存在"关闭"answers"关闭"事件,当用户关闭应用程序时会触发。