![]() |
TOPMOST für 2. Form funktioniert nicht mehr, nachdem das Fenster verschoben wurde
Hallo,
ich bekomme es einfach nicht hin. Vllt. kann mir hier jemand noch einen wertvollen Rat geben. Ich möchte eine kleine Form (Music-Miniplayer) *immer* über allen Fenstern unten rechts über der Uhr anzeigen. Die 2. Form (Music-Miniplayer) hat im Formular-Designer
Delphi-Quellcode:
stehen.
Formstyle := fsStayOnTop
Diese 2. Form wird von der Hauptform über einen Button ShowModal aufgerufen und ich minimiere dann die Hauptform und setze diese auch noch auf Hide. Das klappt! Mein Music-Miniplayer wird über allen "normalen" Fenstern angezeigt. Sobald ich aber diese Form an eine andere Stelle bewege oder die Form den Focus erhält (z.B. durch einen KLick auf einen Button), ist diese Form hinter allen anderen Programm-Fenstern und hat das TOPMOST anscheinend "verloren". :pale: Anfangs hatte ich einfach nur im OnShow der 2. Form
Delphi-Quellcode:
gesetzt. Dann habe ich das weiter "ausgebaut".
SetWindowPos
Ich verwende nach etlichen Versuchen nun folgenden Code:
Delphi-Quellcode:
Im OnMouseMove-Event steht
PROCEDURE Tfrm_MiniPlayer.Set_frm_MiniPlayer_TOPMOST( OnTop: Boolean );
BEGIN IF (OnTop) THEN BEGIN frm_MiniPlayer.FormStyle := fsStayOnTop; SetWindowPos( g_Handle_from_MiniPlayer, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOREPOSITION OR SWP_NOSIZE ); IF RedrawWindow( g_Handle_from_MiniPlayer, NIL, 0, RDW_VALIDATE ) THEN BEGIN SetWindowPos( g_Handle_from_MiniPlayer, HWND_TOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW ); END; END ELSE BEGIN frm_MiniPlayer.FormStyle := fsNormal; SetWindowPos( g_Handle_from_MiniPlayer, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOREPOSITION OR SWP_NOSIZE ); END; END;
Delphi-Quellcode:
...
...
IF ssLeft IN Shift THEN BEGIN Set_frm_MiniPlayer_TOPMOST ( False ); Im OnMouseUp-Event und OnShow-Event steht
Delphi-Quellcode:
Set_frm_MiniPlayer_TOPMOST ( True );
Das Handle (g_Handle_from_MiniPlayer) vom Music-Miniplayer ist korrekt! Hat hier noch jemand eine Idee warum das Fenster, nachdem es einmal verschoben wurde, nicht mehr TOPMOST angezeigt wird? Vielen Dank schon mal vorab! Edit 1: Es reicht schon, wenn der Musicplayer einmal den Focus erhalten hat, wenn man also z.B. einen Button gedrückt hat. Dann ist das TOPMOST-Verhalten auch weg. Edit 2: Ich weiß nicht ob es relevant ist, ich nutze Windows 11. |
AW: TOPMOST für 2. Form funktioniert nicht mehr, nachdem das Fenster verschoben wurde
Delphi-Quellcode:
so ruf ich es auf.
SetWindowPos(Self.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NoMove or SWP_NoSize);
Was mich gerade mehr stutzig macht, du rufst dein formular modal auf aber das erste formular versteckst du dann. Ich vermute mal das Windows das so nicht mag. |
AW: TOPMOST für 2. Form funktioniert nicht mehr, nachdem das Fenster verschoben wurde
noch ein beispiel wie ich es machen würde ohne deinen code da oben.
Delphi-Quellcode:
Wäre ein Versuch Wert mal auszuprobieren ob es bei Dir passt.
Tfrm_MiniPlayer = class(TForm)
... protected procedure CreateParams(var Params: TCreateParams); override; ... implementation procedure Tfrm_MiniPlayer.CreateParams(var Params: TCreateParams); begin inherited CreateParams(Params); Params.ExStyle := Params.ExStyle or WS_EX_TOPMOST or WS_EX_LAYERED; end; |
AW: TOPMOST für 2. Form funktioniert nicht mehr, nachdem das Fenster verschoben wurde
Zitat:
Delphi-Quellcode:
dazupacken. Damit wird das Form vom unsichtbaren Mainform entkoppelt. Das Miniform sollte aber IMO nicht modal sein...
Params.WndParent := 0;
|
AW: TOPMOST für 2. Form funktioniert nicht mehr, nachdem das Fenster verschoben wurde
Zitat:
Genau wegen diesem Modal hab ich es weggelassen, es macht mich nach wie vor stutzig. :gruebel: |
AW: TOPMOST für 2. Form funktioniert nicht mehr, nachdem das Fenster verschoben wurde
Hey Leute, was soll ich sagen: mit CreateParams() funktioniert es!
@KodeZwerg und @peterbelow Vielen Dank euch beiden!! :dp: |
AW: TOPMOST für 2. Form funktioniert nicht mehr, nachdem das Fenster verschoben wurde
Ab und an werden die HWND auch kur weggeworfen und neu erstellt.
Darum sollte man direkte Manipulationen an der WinAPI eh nie nur einmal kurz beim Start gemacht werden. z.B. auch beim AppHung wird das Fenster durch ein DummyFenster mit Screenshot des letzten Zustands vom Original ersetzt, damit der Nutzer wenigstens die Systemfunktionen (verschieben, minimieren und schließen/abschießen) nutzen kann ... nach Ende des Hängens wird dann das Dummyfenster wirder durch's "Original" ersetzt. Auch beim Minimieren oder Ausblenden könnte jemand auf die Idee kommen die HWND/ChildHWND zu entsorgen, um Platz zu sparen, wärend die nicht genutzt werden. Und auch böse, wenn man im Delphi den FormStyle umstellt (fsStayOnTop), dann wird das HWND entsorgt und alles komplett neu erzeugt. :angle: ("alles" was die VCL kennt, oder man an der "richtigen" Stelle ihr gibt) |
AW: TOPMOST für 2. Form funktioniert nicht mehr, nachdem das Fenster verschoben wurde
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz