Die Community zu .NET und Classic VB.
Menü

FAQ 0013: Wie beende ich eine Anwendung richtig?

 von 

Frage 

Wenn ich meine Anwendung beende, zeigt der Taskmanager sie immer noch in der Prozessliste an.
Was mache ich falsch?

Wie beende ich eine fremde Anwendung?

Eigene Anwendung beenden  

Verbleibt die eigene Anwendung nach dem Beenden im Speicher, wird sie mit großer Wahrscheinlichkeit mit End beendet. Dies hat aber den großen Nachteil, daß Dialoge und Objekte nicht entladen, Datenbanken nicht geschlossen, Captures und Hooks nicht freigegeben werden.
Der Stop-Button in der VB-IDE hat übrigens die gleiche Wirkung wie End.

Eine Anwendung wird mit Unload korrekt beendet. Folgendes Beispiel verdeutlicht den Unterschied zwischen Unload und End.
Im Beispiel sind zwei weitere Möglichkeiten gezeigt: Die Rückfrage beim Benutzer und das Umgehen der Rückfrage bei verschiedenen Beendigungsarten.

Private Sub Command1_Click()
    '   Dialog schließen
    Unload Me
End Sub

Private Sub Command2_Click()
    '   Anwendung beenden
    End
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    '   Der Taskmanager und Windows selbst rausfiltern
    Select Case UnloadMode
        Case vbAppTaskManager, vbAppWindows
            '   Immer beenden
            Cancel = False
        Case Else
            '   User fragen, ob wirklich beendet werden soll
            Cancel = (MsgBox("Wirklich beenden?", _
                                        vbYesNo Or vbQuestion) = vbNo)
    End Select
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Dim FRM As Form
    
    '   Alle Dialoge durchlaufen
    For Each FRM In VB.Forms
        '   Dialog entladen
        Unload FRM
        Set FRM = Nothing
    Next FRM
End Sub

Listing 1: Eigene Anwendung beenden

Fremde Anwendung beenden  

Um eine fremde Anwendung zu beenden, sollte man sie zunächst bitten, sich selbst zu beenden:

Declare Function SendNotifyMessage Lib "user32" _
                Alias "SendNotifyMessageA" ( _
                ByVal hwnd As Long, _
                ByVal msg As Long, _
                ByVal wParam As Long, _
                ByVal lParam As Long) As Long

Const WM_SYSCOMMAND As Long = &H112&
Const SC_CLOSE As Long = &HF060&

Listing 2: Fremde Anwendung beenden

Call SendNotifyMessage(hwnd, WM_SYSCOMMAND, SC_CLOSE, 0)

Listing 3: Beispiel für den Aufruf

Wenn eine Anwendung darauf nicht reagiert (man sollte ihr dafür eine gewisse Zeitspanne einräumen, z. B. 20 Sekunden), kann man zu härteren Mitteln (wie z. B. Beliebigen Task ermitteln und terminieren [Tipp 0124]) greifen.

Ihre Meinung  

Falls Sie Fragen zu dieser FAQ haben, Ihre Erfahrung mit anderen Nutzern austauschen möchten oder auf eine Ergänzung hinweisen 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.