2

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

Rhino4.Application oRhino = (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");
        }

我已经设法使用此代码识别过程。但是当我关闭程序时,退出事件不会触发。

4

3 回答 3

3

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

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。

于 2011-06-14T12:29:45.313 回答
2

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

于 2011-06-14T12:26:26.300 回答
0

如果您想在关闭后再次启动应用程序:- 我认为您需要创建一个 Windows 服务,该服务将继续检查进程是否运行,如果它已关闭,则再次启动应用程序

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

于 2011-06-14T12:25:35.567 回答