RSS
StartseiteKnowledge LibraryTop 10Impressum

Blickfänger

Formulare systemweit immer in den Vordergrund setzen

Inaktive Fenster setzt Windows automatisch in den Hintergrund und bietet dem aktivem Fenster die volle Aufmerksamkeit. Fenster lassen sich aber auch immer im Vordergrund halten, unabhängig davon, ob sie gerade aktiv sind oder nicht...

Windows hat die praktische Angewohnheit, nicht benötigte Fenster in den Hintergrund zu setzen und damit dem vordergründigen Fenster die volle Aufmerksamkeit zu geben. Aber es gibt Fälle, wo es sinnvoll erscheint, ein Fenster immer im Vordergrund zu halten, auch wenn es gerade nicht aktiv ist und der Anwender mit einem anderem Fenster arbeitet. Ein Beispiel wäre der NT-Taskmanager.

Das Setzen der Fensterposition erfolgt über die API Funktion SetWindowPos. Der Parameter hwndInsertAfter bestimmt dabei, vor welchem Fenster das über hWnd festgelegte Fenster eingeordnet werden soll. Die Konstante HWND_TOPMOST ordnet das Fenster dabei vor allen anderen Fenstern an und sorgt dafür das es vor allen anderen Fenstern bleibt, während HWND_NOTOPMOST diesen Status wieder aufhebt. Die Flags SWP_NOSIZE und SWP_NOMOVE geben an, dass das Fenster nicht in seiner Größe und Position verändert wird.

Private Declare Function SetWindowPos Lib "user32" ( _
        ByVal hWnd As Long, _
        ByVal hWndInsertAfter As Long, _
        ByVal x As Long, ByVal y As Long, _
        ByVal cx As Long, ByVal cy As Long, _
        ByVal wFlags As Long) As Long

Private Const HWND_TOPMOST = -1
Private Const HWND_NOTOPMOST = -2
  
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOSIZE = &H1

Public Property Let AlwaysOnTop(ByRef Form As Form, _
                                ByVal New_Value As Boolean)
  Dim lngInsertAfter As Long
  
  If (New_Value) Then
    lngInsertAfter = HWND_TOPMOST
  Else
    lngInsertAfter = HWND_NOTOPMOST
  End If
  
  SetWindowPos Form.hWnd, lngInsertAfter, 0, 0, 0, 0, _
               SWP_NOMOVE Or SWP_NOSIZE
End Property

Wenn ein Fenster immer in den Vordergrund gesetzt wurde, hat es den erweiterten Fensterstil WS_EX_TOPMOST. Dieser lässt sich über die API Funktion GetWindowLong ermitteln und zur Abfrage nutzen, ob ein Formular immer im Vordergrund ruht oder nicht:

Private Declare Function GetWindowLong Lib "user32" _
        Alias "GetWindowLongA" _
       (ByVal hWnd As Long, _
        ByVal nIndex As Long _
              ) As Long

Private Const GWL_EXSTYLE = (-20)

Private Const WS_EX_TOPMOST = &H8&

Public Property Get AlwaysOnTop(ByRef Form As Form) As Boolean
  Dim lngExStyle As Long
  
  lngExStyle = GetWindowLong(Form.hWnd, GWL_EXSTYLE)
  AlwaysOnTop = (lngExStyle And WS_EX_TOPMOST) = WS_EX_TOPMOST
End Property