我已经能够使用 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");
}
我已经成功地使用此代码识别了该进程。但是当我关闭程序时,退出事件不会触发。
最佳答案
这可能不是最优雅的解决方案,但您可以通过检查进程是否存在来间接做到这一点,然后重复执行此操作。当然,如果您还没有该进程的句柄的话。
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 类本身创建的。有一个关于这个的讨论here .
其次,根据msdn创建进程时,EnableRaisingEvents 属性应设置为 true,Exited 事件才能正常运行。这让我想知道当您在流程创建后附加事件时会发生什么?
您当然可以在调用 CreateInstance 之前和之后迭代所有匹配进程,以提取已创建的所有新的 Rheno4 实例。但这远非万无一失的解决方案,风险在于您正在获取由其他人创建的进程,或者并非所有进程都被检索(以防创建其他对象出现延迟)。但是,根据您的需要,这可能是适用的。
另一个想法。从 GetProcessesByName 返回的进程有一组丰富的 properties 。也许您可以仔细查看这些内容并找到返回的进程的共同点。我要开始研究的是:Threads、StartInfo、MainModule。
关于c# - 如何以编程方式打开应用程序并检查它何时关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6343366/