我已经能够使用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");
}
我已设法使用此代码识别进程。但是当我关闭程序时,退出事件不会触发。
答案 0 :(得分: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
}
}
}
编辑:在阅读Abdul的回答中的帖子以及您自己的问题后,对此有一些想法。这绝不是一个答案,但也许它可以帮助你完成任务。
首先,Activator.CreateInstance调用您给它的对象类型的最佳拟合构造函数,并返回该对象的句柄。它确实创建了线程/进程本身,因此它不了解它们。您在列表中看到的(9)进程可能是由Rheno4类本身创建的。有关此here的讨论。
其次,根据msdn,在为Exited事件创建进程以正确运行时,应将EnableRaisingEvents属性设置为true。这让我想知道在创建过程后附加事件会发生什么?
当然,您可以在调用CreateInstance之前和之后迭代所有匹配的进程,以提取已创建的Rheno4的所有新实例。但这远不是一个防弹解决方案,而且风险在于您正在获取由其他人创建的进程,或者并非所有进程都已被检索(如果创建其他对象时出现延迟)。但是,根据您的需要,这可能是适用的。
另一种想法。从GetProcessesByName返回的进程有一组丰富的properties。也许你可以看看这些并找到返回过程的共同点。我开始研究的是:Threads,StartInfo,MainModule。答案 1 :(得分: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。
答案 2 :(得分:0)
如果您想在关闭后再次启动应用程序: - 我认为你需要创建一个Windows服务,它将继续检查进程是否正在运行,如果它已关闭,那么再次启动应用程序
就事件而言,Windows应用程序中存在“关闭”和“关闭”事件,当用户关闭应用程序时会触发事件。