我有一个C#的Winform应用程序,在其工作期间会打开另一个Winform进程。这个进程拥有自己的UI界面。当我关闭父应用程序时,我希望另一个应用程序能够自动关闭。
我该如何实现呢?
谢谢。
我有一个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();
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();
}
}
}
最优雅的方式可能是向其他进程的主窗口发送一个窗口消息。您可以使用Process
类获取此主窗体的句柄,只需简单地使用Process.MainWindow.Handle
属性即可。然后,使用PostMessage
Win API调用并发送带有自定义ID的消息到此 "子" 进程的主窗口。接着,其他进程的消息循环可以轻松检测到此消息(通过重写WndProc
方法),并相应地执行适当的关闭操作。或者,您可以发送标准的WM_CLOSE
方法,这意味着您只需在Form.Closed
事件处理程序中卸载应用程序,但可能会让您在某些情况下对关闭操作的取消控制力更少。