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

时间:2009-06-03 08:40:01

标签: c# winforms

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

我怎样才能做到这一点?

由于

3 个答案:

答案 0 :(得分:4)

如果您使用Process.Process,则有CloseMainWindow方法。如果你保留对象的引用,你可以在以后使用它。

以下是MSDN

中的相关页面

和相关代码:

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

答案 1 :(得分:3)

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

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

当应用程序关闭时,您可以调用一个方法来关闭仍在运行的所有已启动的子进程。您可以使用Kill方法或通过调用CloseMainWindow和Close方法来使用它。 CloseMainWindow / Close将执行更优雅的关闭(如果您启动记事本并且有未保存的更改,Kill将丢失它们,CloseMainWindow / Close将使记事本询问您是否要保存):

private void CloseStartedProcesses()
{
    while (_startedProcesses.Count > 0)
    {
        Process process = _startedProcesses.Pop();
        if (process != null && !process.HasExited)
        {
            process.CloseMainWindow();
            process.Close();
        }
    }
}

答案 2 :(得分:1)

最优雅的方法是将窗口消息发送到另一个进程的主要消息。您可以使用Process.MainWindow.Handle属性获取此主窗体的句柄(我假设您使用的是Process类,然后只需使用PostMessage Win API调用来发送消息这个“子”进程的主窗口的自定义ID。然后,另一个进程的消息循环可以轻松检测到此消息(通过覆盖WndProc方法)并相应地执行正确的关闭。另一种方法是发送标准的WM_CLOSE方法,这意味着您只需要从Form.Closed事件的处理程序中卸载应用程序,但可能会让您减少控制(关于是否取消某些关闭)情况)。