Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
36.076 Beiträge
 
Delphi 10.4 Sydney
 
#12

AW: AlwaysOnTop mit mehreren Formularen

  Alt 9. Mai 2020, 22:18
siehe #5 ?

[edit]
Hab's aber grad nochmal probiert ... ich glaub Delphi bzw. die VCL ist Schuld.

Vorhin falsch geguckt, denn so ist es aktuell in Windows 10 + Delphi 10.3:
* das zweite Fenster ist immer über dem Ersten
* wären Beide gleich (StayOnTop oder nicht), müsste jeweils das Aktive oben sein
* vermutlich irgendwas in Richtung PopupMode, aber das steht (standardmäßig) eigentlich auf pmNone :grueble:

[edit2]
Delphi-Quellcode:
procedure TCustomForm.CreateParams(var Params: TCreateParams);
...
        case LPopupMode of
          pmNone:
            begin
              if Application.MainFormOnTaskBar then
              begin
                // FCreatingMainForm is True when the MainForm is
                // being created, Self = Application.MainForm during CM_RECREATEWND.
                if FCreatingMainForm or (Self = Application.MainForm) then
                  WndParent := 0
                else
                  if Assigned(Application.MainForm) and Application.MainForm.HandleAllocated then
                  begin
                    WndParent := Application.MainFormHandle;
                    if WndParent = Application.MainForm.Handle then
                    begin
                      if Application.MainForm.PopupChildren.IndexOf(Self) < 0 then
                        Application.MainForm.PopupChildren.Add(Self); <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                      FreeNotification(Application.MainForm);
                    end;
                  end
                  else
                    WndParent := Application.Handle;
              end
              else
              begin
                WndParent := Application.Handle;
                SetWindowLong(WndParent, GWL_EXSTYLE, GetWindowLong(WndParent, GWL_EXSTYLE) and not WS_EX_TOOLWINDOW);
              end;
            end;
          pmAuto:
            begin
              if FCreatingMainForm then
                WndParent := 0 // A main form can't be parented to another form
              else
Keine Ahnung wer auf diese bescheuerte Idee gekommen ist auch bei NONE etwas zu machen.

Lösung:
Und statt OnActivate, ist sowieso CreateWnd besser. (auch wenn Beides geht)
Delphi-Quellcode:
type
  TForm3 = class(TForm)
    procedure FormCreate(Sender: TObject);
  protected
    procedure CreateWnd; override;
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.CreateWnd;
begin
  inherited;
  SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
end;

procedure TForm3.FormCreate(Sender: TObject);
begin
  PopupMode := TPopupMode(9);
end;
[Edit3]
Oder Application.OnGetMainFormHandle benutzen und dort HWND(-1) zurückgeben.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu ( 9. Mai 2020 um 22:48 Uhr)
  Mit Zitat antworten Zitat