AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi TOPMOST für 2. Form funktioniert nicht mehr, nachdem das Fenster verschoben wurde
Thema durchsuchen
Ansicht
Themen-Optionen

TOPMOST für 2. Form funktioniert nicht mehr, nachdem das Fenster verschoben wurde

Ein Thema von juergen · begonnen am 26. Jan 2022 · letzter Beitrag vom 28. Jan 2022
Antwort Antwort
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.164 Beiträge
 
Delphi 11 Alexandria
 
#1

TOPMOST für 2. Form funktioniert nicht mehr, nachdem das Fenster verschoben wurde

  Alt 26. Jan 2022, 22:44
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.
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)

Geändert von juergen (26. Jan 2022 um 22:58 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: TOPMOST für 2. Form funktioniert nicht mehr, nachdem das Fenster verschoben wurde

  Alt 26. Jan 2022, 22:57
SetWindowPos(Self.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NoMove or SWP_NoSize); so ruf ich es auf.
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.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: TOPMOST für 2. Form funktioniert nicht mehr, nachdem das Fenster verschoben wurde

  Alt 26. Jan 2022, 23:10
noch ein beispiel wie ich es machen würde ohne deinen code da oben.
Delphi-Quellcode:
  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;
Wäre ein Versuch Wert mal auszuprobieren ob es bei Dir passt.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
672 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: TOPMOST für 2. Form funktioniert nicht mehr, nachdem das Fenster verschoben wurde

  Alt 27. Jan 2022, 15:15
noch ein beispiel wie ich es machen würde ohne deinen code da oben.
Delphi-Quellcode:
  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;
Wäre ein Versuch Wert mal auszuprobieren ob es bei Dir passt.
Guter Ansatz, aber ich würde noch ein
Params.WndParent := 0; dazupacken. Damit wird das Form vom unsichtbaren Mainform entkoppelt. Das Miniform sollte aber IMO nicht modal sein...
Peter Below
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: TOPMOST für 2. Form funktioniert nicht mehr, nachdem das Fenster verschoben wurde

  Alt 27. Jan 2022, 15:34
Guter Ansatz, aber ich würde noch ein
Params.WndParent := 0; dazupacken. Damit wird das Form vom unsichtbaren Mainform entkoppelt. Das Miniform sollte aber IMO nicht modal sein...

Genau wegen diesem Modal hab ich es weggelassen, es macht mich nach wie vor stutzig.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.164 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: TOPMOST für 2. Form funktioniert nicht mehr, nachdem das Fenster verschoben wurde

  Alt 27. Jan 2022, 15:57
Hey Leute, was soll ich sagen: mit CreateParams() funktioniert es!
@KodeZwerg und @peterbelow Vielen Dank euch beiden!!
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.163 Beiträge
 
Delphi 12 Athens
 
#7

AW: TOPMOST für 2. Form funktioniert nicht mehr, nachdem das Fenster verschoben wurde

  Alt 27. Jan 2022, 17:44
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. ("alles" was die VCL kennt, oder man an der "richtigen" Stelle ihr gibt)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (27. Jan 2022 um 17:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: TOPMOST für 2. Form funktioniert nicht mehr, nachdem das Fenster verschoben wurde

  Alt 28. Jan 2022, 00:24
Hey Leute, was soll ich sagen: mit CreateParams() funktioniert es!
@KodeZwerg und @peterbelow Vielen Dank euch beiden!!
Gern geschehen!
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz