' Licensed to the .NET Foundation under one or more agreements. ' The .NET Foundation licenses this file to you under the MIT license. Imports System.Security Imports System.Windows.Forms Namespace Microsoft.VisualBasic.ApplicationServices Partial Public Class WindowsFormsApplicationBase ''' <summary> ''' Encapsulates an ApplicationContext. We have our own to get the shutdown behaviors we ''' offer in the application model. This derivation of the ApplicationContext listens for when ''' the main form closes and provides for shutting down when the main form closes or the ''' last form closes, depending on the mode this application is running in. ''' </summary> Private NotInheritable Class WinFormsAppContext Inherits ApplicationContext Private ReadOnly _app As WindowsFormsApplicationBase Public Sub New(App As WindowsFormsApplicationBase) _app = App End Sub ''' <summary> ''' <list type="number"> ''' <item> ''' <description>Shutdown when the main form closes.</description> ''' </item> ''' <item> ''' <description>Shutdown only after the last form closes.</description> ''' </item> ''' </list> ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> <SecuritySafeCritical()> Protected Overrides Sub OnMainFormClosed(sender As Object, e As EventArgs) If _app.ShutdownStyle = ShutdownMode.AfterMainFormCloses Then MyBase.OnMainFormClosed(sender, e) Else ' identify a new main form so we can keep running Dim forms As FormCollection = Application.OpenForms If forms.Count > 0 Then ' Note: Initially I used Process::MainWindowHandle to obtain an open form. ' But that is bad for two reasons: ' 1 - It appears to be broken and returns NULL sometimes even when ' there is still a window around WinForms people are looking at that issue. ' 2 - It returns the first window it hits from enum thread windows, ' which is not necessarily a windows forms form, so that doesn't help ' us even if it did work all the time. So I'll use one of our open forms. ' We may not necessarily get a visible form here but that's OK. ' Some apps may run on an invisible window and we need to keep them going ' until all windows close. MainForm = forms(0) Else MyBase.OnMainFormClosed(sender, e) End If End If End Sub End Class End Class End Namespace |