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

5

我有一个C#的Winform应用程序,在其工作期间会打开另一个Winform进程。这个进程拥有自己的UI界面。当我关闭父应用程序时,我希望另一个应用程序能够自动关闭。

我该如何实现呢?

谢谢。


请查看此链接:http://stackoverflow.com/questions/169483/c-win32-notify-when-separate-window-is-closing-closed - almog.ori
这指的是一项类似但相反的任务(当另一个窗口关闭时关闭当前应用程序)。然而,那里链接的CodeProject文章应该会有所帮助。 - Noldorin
3个回答

5
如果您正在使用 Process.Process,那么就有 CloseMainWindow 方法。如果您保留对象的引用,则稍后可以使用它。
这是在MSDN上相关的页面。
以下是相关代码:
// Close process by sending a close message to its main window.
myProcess.CloseMainWindow();
// Free resources associated with process.
myProcess.Close();

我看不出来为什么要踩这个答案;它是一个完全可行的解决方案(尽管在调用Close方法之前,我会添加一个CloseMainWindow的调用)。 - Fredrik Mörk
因为Shoban的回答相同的原因而被down-voted。这不是关闭进程的正确方法。 - Noldorin
好的,我一开始使用了错误的方法,但是仔细阅读MSDN页面后找到了正确的方法 - 我相信原帖作者也能做到。 - ChrisF
取消了踩,CloseMainWindow 才是正确的方法。 :) - Noldorin
谢谢 - 我应该自己再仔细查看一下帮助页面 ;) - ChrisF

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

1

最优雅的方式可能是向其他进程的主窗口发送一个窗口消息。您可以使用Process类获取此主窗体的句柄,只需简单地使用Process.MainWindow.Handle属性即可。然后,使用PostMessage Win API调用并发送带有自定义ID的消息到此 "子" 进程的主窗口。接着,其他进程的消息循环可以轻松检测到此消息(通过重写WndProc方法),并相应地执行适当的关闭操作。或者,您可以发送标准的WM_CLOSE方法,这意味着您只需在Form.Closed事件处理程序中卸载应用程序,但可能会让您在某些情况下对关闭操作的取消控制力更少。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接