Code zu Fenstern und Formularen in .NET

Inhaltsverzeichnis

In einigen Fällen ist es erforderlich, die Ursache für das Schließen eines Fensters zu kennen. Zu diesem Zweck stehen verschiedene Wege bereit, die wir in Folge ansehen wollen. Im folgenden Beispiel wird Einsicht in einen Stackframe eines Stacktraces genommen und so ermittelt, welche Plattformfunktion zuletzt aufgerufen wurde:

Imports System.ComponentModel
Imports System.Diagnostics
Imports System.Windows.Forms

Public Class SampleForm
    Inherits Form

    ⋮

    Private Sub SampleForm_Closing( _
        ByVal sender As Object, _
        ByVal e As CancelEventArgs _
    ) Handles MyBase.Closing
        Dim f As New StackTrace(True).GetFrame(7)
        Select Case f.GetMethod().Name
            Case "SendMessage"
                MsgBox("Schließen in Folge eines Aufrufs im Code.")
            Case "CallWindowProc"
                MsgBox("Schließen über das Systemmenü.")
            Case "DispatchMessageW"
                MsgBox("Schließen über den Task-Manager.")
            Case Else
                MsgBox("Unbekannte Ursache für das Schließen.")
        End Select
    End Sub
End Class
Ursache für das Schließen eines Formulars ermitteln.

Ob das Fenster über die Systemschaltfläche oder das Systemmenü geschlossen wurde, kann man auch durch Überschreiben der Methode WndProc des Formulars ermitteln. Über Hineinhorchen in die Nachrichtenschleife kann zudem herausgefunden werden, ob das Herunterfahren des Betriebssystems der Grund für das Schließen des das Fenster ist:

Private Const WM_SYSCOMMAND As Int32 = &H112

Private Const SC_CLOSE As Int32 = &HF060

Protected Overrides Sub WndProc(ByRef m As Message)
    If m.Msg = WM_SYSCOMMAND AndAlso m.WParam.ToInt32() = SC_CLOSE Then
        MsgBox( _
            "Über die Systemschalftläche oder das Systemmenü geschlossen." _
        )
    End If
    MyBase.WndProc(m)
End Sub
Abhören der Fensterprozedur nach WM_SYSCOMMAND.

Anzeigen der Systeminformationen

In Visual Basic 6.0 war eine Formularvorlage für einen Informationsdialog enthalten, den man in seine Anwendungen einbinden konnte. Dieser Dialog enthielt auch eine Schaltfläche, über die die Systeminformationen angezeigt werden konnten. Auch wenn der Sinn einer solchen Schaltfläche in Frage zu stellen ist, kann es vorkommen, daß man dem Benutzer die Möglichkeit geben will, die Systeminformationen anzuzeigen.

Folgendes Beispiel liest aus der Systemregistrierung den Pfad der Anwendung aus, in der die Systeminformationen implementiert sind. Existiert die Datei, dann wird sie gestartet. Auf Fehlerbehandlung wurde verzichtet. Unter alten Windows-Versionen kann der Pfad nicht auf diese Weise abgefragt werden. Damit das Beispiel funktioniert, müssen die Namensräume Microsoft.Win32 und System.IO importiert werden:

Dim FileName As String = _
    Registry.LocalMachine.OpenSubKey( _
        "SOFTWARE\Microsoft\Shared Tools\MSINFO" _
    ).GetValue( _
        "Path", _
        "" _
    )
If File.Exists(FileName) Then
    Process.Start(FileName)
End If
Starten der Systeminformationen.

Scheinbares Senken des Speicherbedarfs von Formularen

Windows-Forms-Formulare benötigen im nicht-minimierten Zustand sehr viel Arbeitsspeicher. Über die Windows-API-Funktion SetProcessWorkingSize kann der Speicherbedarf scheinbar reduziert werden. Tatsächlich wird jedoch nur das Minimieren des Hauptfensters der Anwendung simuliert, was bewirkt, daß Daten der Anwendung ausgelagert und der Speicher anderen Anwendungen zur Verfügung gestellt wird. Dem zugrunde liegt der Gedanke, daß minimierte Anwendungen für einige Zeit vom Benutzer nicht verwendet werden und deshalb andere Anwendungen Speicher dringender benötigen.

Private Declare Function SetProcessWorkingSetSize Lib "kernel32.dll" ( _
    ByVal hProcess As IntPtr, _
    ByVal dwMinimumWorkingSetSize As Int32, _
    ByVal dwMaximumWorkingSetSize As Int32 _
) As Boolean

Public Function SaveMemory() As Boolean
    Return _
        SetProcessWorkingSetSize( _
            Process.GetCurrentProcess().Handle, _
            -1, _
            -1 _
        )
End Function
Scheinbare Reduktion des Speicherbedarfs von Windows-Forms-Formularen.