Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何以编程方式打开应用程序并检查它何时';什么时候关门?_C#_Automation_Activator - Fatal编程技术网

C# 如何以编程方式打开应用程序并检查它何时';什么时候关门?

C# 如何以编程方式打开应用程序并检查它何时';什么时候关门?,c#,automation,activator,C#,Automation,Activator,我已经能够使用winforms应用程序打开另一个winforms应用程序,使用: Rhino4.Application oRhino=(Rhino4.Application)Activator.CreateInstance(Type.GetTypeFromProgID(“Rhino4.Application”) 但我如何检查它是否关闭?是否可以创建一个在用户关闭应用程序时触发的事件 编辑 Process[] pr = Process.GetProcessesByName("Rhino4");

我已经能够使用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");
        }
Process[]pr=Process.getProcessByName(“Rhino4”);
对于(int i=0;i4)
{
if(pr[i].MainWindowTitle.Substring(0,4)=“墙”)
{
pr[i].退出+=新事件处理程序(caseInfoMenu\u退出);
}
}
}
}
void caseInfoMenu_退出(对象发送方,事件参数e)
{
MessageBox.Show(“窗口关闭”);
}

我已经使用此代码成功地识别了流程。但是,当我关闭程序时,退出事件不会触发。

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


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

捕获退出的
事件怎么样

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);
    }

来源。

这可能不是最优雅的解决方案,但间接地说,您可以通过检查该过程是否存在来执行此操作,然后重复执行此操作。当然,如果您还没有流程的句柄,那么就需要这样做

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

编辑:在阅读了Abdul回答中的帖子以及你自己的问题后,对此有一些想法。这绝不是一个答案,但也许它可以帮助你的追求

首先,Activator.CreateInstance调用您为其指定的对象类型上的最佳拟合构造函数,并返回该对象的句柄。它确实自己创建了线程/进程,因此它不了解这些线程/进程。您将在列表中看到的(9)个进程可能是由Rheno4类本身创建的。对此有一个讨论

其次,根据EnableRaisingEvents,当创建流程以使退出的事件正常运行时,属性应设置为true。这让我想知道,在创建流程之后附加事件会发生什么

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


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

窗口还是控制台?为了实现您的愿望,这两种方法是不同的。我已经更新了我的答案,并对您的问题提出了进一步的思考。@Abdul Muqtadir-我如何从应用程序中获得流程。我之所以使用Activator.CreateInstance,是因为我需要控制应用程序。我在打开应用程序后启动了一个脚本,需要知道用户是否关闭了它。无法获取您,您不能启动该过程吗?不,因为我无法控制已启动的应用程序。但也许我可以将您提到的退出事件与Process.GetProcessByName?@Bildsoe结合起来:看看Abdul提供的MSDN示例中的代码。如果您以代码启动应用程序,并且可以保存流程句柄,那么我认为您应该采用这种方法,因为它可以最大程度地控制流程。如果你不能控制进程(即,它是由windows/user/etc启动的),那么我建议使用GetProcessByName方法,我自己使用它,我相信它是坚如磐石的。我看不出将两者混合使用有什么意义。@Tele von Plan-我的问题是,我需要逐个application.createInstance创建应用程序实例,以便访问应用程序的脚本模块。我将如何处理当前流程?当我尝试访问process.handle时,访问被拒绝。那我用mainWindowTitle吗?因为我尝试了这个,但它没有返回任何结果。如果您创建了此类windows服务,请注意,您无法轻松地将gui应用程序作为系统服务启动。这是可能的,但并不总是推荐的,请参阅以获取有关该主题的更多信息。von Plan-这给了我很多工作要做。谢谢我要调查一下房子,我想你是对的。其中一个必须包含一些我可以使用的信息。