C# 关闭应用程序时关闭另一个进程

C# 关闭应用程序时关闭另一个进程,c#,winforms,C#,Winforms,我有一个C#winform应用程序,它在工作期间打开另一个winform进程。另一个进程有自己的UI。 当我关闭父应用程序时,我希望另一个应用程序自动关闭 我怎样才能做到这一点 如果您使用的是Process,请感谢。Process有CloseMainWindow方法。如果保留对该对象的引用,则可以稍后使用它 这是网站的相关页面 及有关守则: // Close process by sending a close message to its main window. myProcess.Clos

我有一个C#winform应用程序,它在工作期间打开另一个winform进程。另一个进程有自己的UI。 当我关闭父应用程序时,我希望另一个应用程序自动关闭

我怎样才能做到这一点


如果您使用的是
Process,请感谢。Process
CloseMainWindow
方法。如果保留对该对象的引用,则可以稍后使用它

这是网站的相关页面

及有关守则:

// Close process by sending a close message to its main window.
myProcess.CloseMainWindow();
// Free resources associated with process.
myProcess.Close();

最优雅的方法可能是从另一个进程的主进程向主进程发送窗口消息。您只需使用
Process.MainWindow.handle
属性即可获得此主窗体的句柄(我假设您使用的是
Process
类,然后只需使用
PostMessage
Win API调用将带有自定义ID的消息发送到此“子窗体”的主窗口然后,另一个进程的消息循环可以很容易地检测到此消息(通过重写
WndProc
方法)并相应地执行适当的关闭。另一种方法是发送标准的
WM_CLOSE
方法,这意味着您只需从
表单.Closed
事件的处理程序中卸载应用程序,但可能会减少控制(在某些情况下是否取消关闭).

有几种不同的选择。我建议您让应用程序跟踪它启动的流程:

private Stack<Process> _startedProcesses = new Stack<Process>();
private void StartChildProcess(string fileName)
{
    Process newProcess = new Process();
    newProcess.StartInfo = new ProcessStartInfo(fileName); ;
    newProcess.Start();    
    _startedProcesses.Push(newProcess);
}

我看不出为什么要否决这一点;这是一个完全可行的解决方案(尽管我会在调用Close方法之前添加对CloseMainWindow的调用).Down投票的原因与Shoban的答案相同。这不是关闭流程的正确方法。好吧,我从错误的方法开始,但真正阅读MSDN页面时给出了正确的方法-我相信OP可以删除Down投票。CloseMain窗口实际上是一种方法。:)谢谢-我应该自己仔细检查一下帮助页面;)查看此链接,该链接指向一个类似但相反的任务(当另一个窗口关闭时关闭当前应用)。然而,链接到那里的CodeProject文章应该有一些用处。
private void CloseStartedProcesses()
{
    while (_startedProcesses.Count > 0)
    {
        Process process = _startedProcesses.Pop();
        if (process != null && !process.HasExited)
        {
            process.CloseMainWindow();
            process.Close();
        }
    }
}