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
Formstyle := fsStayOnTop
stehen.
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".
Anfangs hatte ich einfach nur im OnShow der 2. Form
SetWindowPos
gesetzt. Dann habe ich das weiter "ausgebaut".
Ich verwende nach etlichen Versuchen nun folgenden Code:
Delphi-Quellcode:
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;
Im OnMouseMove-Event steht
Delphi-Quellcode:
...
IF ssLeft IN Shift THEN
BEGIN
Set_frm_MiniPlayer_TOPMOST ( False );
...
Im OnMouseUp-Event und OnShow-Event steht
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.