Die Community zu .NET und Classic VB.
Menü

VB.NET-Tipp 0034: Den Grund für das Schließen des Fensters herausfinden

 von 

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:

Schwierigkeitsgrad 2

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:

Download des Beispielprojektes [2,94 KB]

' 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.