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
- modAlwaysOnTop und Beispielprojekt (alwaysontop.zip - 3 KB)