VB.NET-Tipp 0034: Den Grund für das Schließen des Fensters herausfinden
von Herfried Wagner
Beschreibung
Unter VB6 war es möglich, herauszufinden, wodurch ein Formular geschlossen wird. Dies ist unter .NET nicht direkt möglich, mit Subclassing kann jedoch festgestellt werden, ob das Schliessen der Anwendung, d.h. eines Formulars, durch das Herunterfahren von Windows, dem Abmelden des Benutzers oder durch den Benutzer selbst verursacht wurde.
Schwierigkeitsgrad: | Framework-Version(en): .NET Framework 1.0, .NET Framework 1.1, .NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5 | .NET-Version(en): Visual Basic 2002, Visual Basic 2003, Visual Basic 2005, Visual Basic 2008 | Download: |
' Dieser Quellcode stammt von http://www.activevb.de ' und kann frei verwendet werden. Für eventuelle Schäden ' wird nicht gehaftet. ' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum. ' Ansonsten viel Spaß und Erfolg mit diesem Source! ' Projektversion: Visual Studio 2002/2003 ' Option Strict: An ' Option Explicit: An ' ' Referenzen: ' - System ' - System.Drawing ' - System.Windows.Forms ' ' ############################################################################## ' ################################ MainForm.vb ################################# ' ############################################################################## Option Explicit On Option Strict On Option Compare Binary Imports System Imports System.Windows.Forms ' <remarks> ' Hauptformular der Anwendung. ' </remarks> Public Class MainForm Inherits System.Windows.Forms.Form Private Const WM_QUERYENDSESSION As Int32 = &H11 Private Const WM_ENDSESSION As Int32 = &H16 Private m_blnSystemShutdown As Boolean Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) ' Wenn Windows sein Beenden ankündigt. If m.Msg = WM_QUERYENDSESSION Then ' Windows mitteilen, dass die Anwendung beendet werden kann. ' Ist(dies) nicht ohne Probleme der Fall, sollte 0 zurückgegeben ' werden. Dies hat aber unter Windows XP anscheinend keine ' Auswirkung, da Windows trotzdem heruntergefahren wird. m.Result = New IntPtr(1) ' Windows fordert nun von der Anwendung, ' sich zum Beenden bereit zu machen. ElseIf m.Msg = WM_ENDSESSION Then ' Wenn wParam = 1, dann wird Windows beendet. ' Hierbei sind verschiedene Fälle bei ' älteren Windows-Versionen in der MSDN vermerkt, ' die hier nicht berücksichtigt werden. If m.WParam.ToInt32() = 1 Then Me.SystemShutdown = True m.Result = IntPtr.Zero End If End If MyBase.WndProc(m) End Sub Private Sub MainForm_Closed(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles MyBase.Closed ' Der Aufräumcode muss im Ereignis Closed plaziert werden, nicht im ' Ereignis Closing, da zu diesem Zeitpuntk die Ursache für das Beenden ' noch nicht klar ist. MessageBox.Show("Schliessen wegen Herunterfahren oder Abmelden: " & _ SystemShutdown.ToString() & ".", Application.ProductName, _ MessageBoxButtons.OK, MessageBoxIcon.Information) End Sub ''' <summary> ''' Gibt an oder gibt zurück, ob das System heruntergefahren wird. ''' </summary> ''' <value>Wert der angibt, ob das System heruntergefahren wird.</value> Private Property SystemShutdown() As Boolean Get Return m_blnSystemShutdown End Get Set(ByVal Value As Boolean) m_blnSystemShutdown = Value End Set End Property End Class
Ihre Meinung
Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.