RSS
StartseiteKnowledge LibraryTop 10Impressum

Versteckspiele

Die ShowInTaskbar-Eigenschaft eines Form zur Laufzeit setzen

Die ShowInTaskbar-Eigenschaft zählt zu den Eigenschaften eines Formular, die Sie nur zur Design-Zeit festlegen können. Dennoch können Sie auch zur Laufzeit festlegen, ob ein Formular in der Taskleiste angezeigt werden soll, oder nicht..

Einige Eigenschaften von Formularen können Sie nur zur Design-Zeit in der IDE festlegen. Dazu gehört auch die ShowInTaskbar-Eigenschaft – man kann Sie zur Laufzeit abfragen, aber nicht setzen. Kann man doch! Zumindest wenn man direkt das Windows API bemüht.

In der Taskleiste werden generell alle Fenster angezeigt, die den erweiterten Fensterstil WS_EX_APPWINDOW besitzen. Die gesetzten Fensterstile können über die API Funktion GetWindowLong abgefragt werden. Hier kann man jetzt den Fensterstil WS_EX_APPWINDOW hinzufügen oder entfernen, je nachdem, ob die Anwendung in der Taskleiste angezeigt werden soll, oder nicht. Die neuen Fensterstile werden über die API Funktion SetWindowLong gesetzt. Damit diese Aktualisierung auch bei der Taskleiste ankommt, muss das Formular vor Setzen dieses Stils ausgeblendet werden. Sobald der neue Fensterstil gesetzt ist, kann das Formular wieder eingeblendet werden.

Für eine einfache Anwendung, werden alle API Aufrufe in zwei Property-Prozeduren "ShowInTaskBarRT" verpackt. Beide erwarten das entsprechende Form als Parameter. So kann der aktuelle Taskleisten-Status des Form gelesen und gesetzt werden, fast so als wären es Eigenschaften des Form:

Private Declare Function GetWindowLong Lib "user32" _
        Alias "GetWindowLongA" ( _
        ByVal hwnd As Long, _
        ByVal nIndex As Long _
              ) As Long
Private Declare Function SetWindowLong Lib "user32" _
        Alias "SetWindowLongA" ( _
        ByVal hwnd As Long, _
        ByVal nIndex As Long, _
        ByVal dwNewLong As Long _
              ) As Long
Private Const GWL_EXSTYLE = (-20)

Private Const WS_EX_APPWINDOW = &H40000

Private Declare Function ShowWindow Lib "user32" ( _
        ByVal hwnd As Long, _
        ByVal nCmdShow As Long _
              ) As Long
Private Const SW_HIDE = 0
Private Const SW_SHOW = 5

Public Property Get ShowInTaskbarRT(ByRef Form As Form) As Boolean
  Dim lExStyle As Long
  
  lExStyle = GetWindowLong(Form.hwnd, GWL_EXSTYLE)
  
  ShowInTaskbarRT = (lExStyle And WS_EX_APPWINDOW) = WS_EX_APPWINDOW
End Property

Public Property Let ShowInTaskbarRT(ByRef Form As Form, _
                                    ByVal New_Value As Boolean)
  Dim lExStyle As Long
  Dim lVisible As Boolean
  
  With Form
    lVisible = .Visible
    lExStyle = GetWindowLong(.hwnd, GWL_EXSTYLE)
    
    If New_Value Then
      lExStyle = lExStyle Or WS_EX_APPWINDOW
    Else
      lExStyle = lExStyle And Not WS_EX_APPWINDOW
    End If
    
    ShowWindow .hwnd, SW_HIDE
    SetWindowLong .hwnd, GWL_EXSTYLE, lExStyle
    
    If lVisible Then
      ShowWindow .hwnd, SW_SHOW
    End If
  End With
End Property