我希望在关闭parrent应用程序时关闭子应用程序(即fileViewer:Window)。
注意:此parrent应用程序不是主应用程序。
这意味着我有C#winform应用程序,它有3个级别。
第1是主要申请 第二是主应用程序的子应用程序 第3次是第2次申请
当我关闭第二个应用程序时,我希望第三个应用程序将自动关闭。
这个帖子Close another process when application is closing非常有用,但我不知道在哪里调用process.close()
或fileViewer.FileBrowser.Dispose();
等方法
public void OpenNewInstanceOf2nd()
{
//Use .NET Diagnostics to start a new process off the 2nd
try
{
System.Diagnostics.Process.Start(MyFramework.FileSystem.ApplicationPath + MyProperties.MyAssemblyName);
}
catch (Exception ex)
{
MyFramework.Debug.LogException(ex, "Could not open the My Utility");
}
}
答案 0 :(得分:3)
如果只是您要关闭的表单,可以将表单3的所有者设置为表单2。如果您关闭表格2,表格3也将关闭。
private void Form2nd_Load(object sender, EventArgs e)
{
Form3rd form_3rd = new Form3rd();
form_3rd.Show(this);
}
如果它是一个嵌套的流程/工作线程,为什么不在第二个表单/应用程序中保留引用并在第二个应用程序关闭时处理它?</ p>
答案 1 :(得分:2)
如果我理解你的问题,你有3个不同的过程,其中最后两个由前一个创建:
Proc1&gt; Proc2&gt; PROC3
我想问你的第一件事是你真的需要这样的设置。如果一切都在你的控制之下,你应该考虑制作一个进程,但如果由于某种原因你确实需要这样做(即你需要运行其他命令行实用程序),那么继续......
如果您在代码中创建“子”进程,则可以保留引用:
Process proc2 = Process.Start("proc2.exe");
然后关闭该过程:
proc2.CloseMainWindow();
proc2.Close();
如果您无法控制Proc2,您可以使用
从Proc1获取Proc3的参考Process.GetProcessesByName("proc3.exe");
请记住,Process.CloseMainWindow()仅适用于具有窗口的应用程序,对命令行实用程序没用。控制其他第三方流程可能很棘手,这实际上取决于它们的实施方式,所以我不能更具体。
在评论中的详细信息之后,我将添加以下内容: 如果你从你自己的代码启动Proc2,你可以引用它的Process对象,这样你就可以注册到Exited事件,然后搜索并关闭Proc3:
proc2 = Process.Start("HelpViewer.exe");
proc2.Exited += new EventHandler(proc2_Exited);
proc2.EnableRaisingEvents = true;
void proc2_Exited(object sender, EventArgs e)
{
//Unregister the event and free the object resources
proc2.Exited -= new EventHandler(proc2_Exited);
proc2.Close();
//Search and close the other process(es)
Process[] processes = Process.GetProcessesByName("HelpViewer.exe");
foreach(Process process in processes)
process.CloseMainWindow();
}
如果你没有从你的代码中启动Proc2而不是没有简单的解决方案。