我有一个C#winform应用程序,在其工作期间打开另一个Winform进程。另一个进程具有自己的UI。 当我关闭父应用程序时,我希望自动关闭其他应用程序。
我怎样才能做到这一点?
由于
答案 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
事件的处理程序中卸载应用程序,但可能会让您减少控制(关于是否取消某些关闭)情况)。