Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

AW: AlwaysOnTop mit mehreren Formularen

  Alt 9. Mai 2020, 01:47
Das Property FormStyle = fsStayOnTop macht eigentlich genau das
"genau" ist trifft es nicht so ganz genau.

Beim Ändern wird die innere Form komplett neu generiert, anstatt nur die eine Option zu ändern.


In Windows 10, da ist und bleibt zwar bei beiden Forms die Option aktiv (siehe Caption), aber nur der Erste, welcher diese Option setzt, ist wirklich ganz oben.

Unabhängig vom ExStyle, gibt es ja auch nur eine Liste mit den Z-Positionen und da kann nur einer ganz oben sein,
aber vielleicht wurde das früher im Windows mal anders behandelt.

Eventuell gibt es auch noch einen Unterschied bei MultiMonitor-Systemen, wenn man jemanden glauben mag, falls man z.B. nach Bei Google suchenmultiple HWND_TOPMOST sucht.
Hab hier jetzt nur einen Monitor aktiv (bzw. ist gespiegelt), aber könnte es nächste Woche mal ausprobieren.

Delphi-Quellcode:
uses Unit2;

implementation

procedure TForm1.Button1Click(Sender: TObject);
begin
  TForm2.Create(Self).Show;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
  //SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_TOPMOST);
  // theoretisch, aber ändern via SetWindowLong, siehe https://docs.microsoft.com/de-de/windows/win32/winmsg/extended-window-styles
  SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Caption := BoolToStr(GetWindowLong(Handle, GWL_EXSTYLE) and WS_EX_TOPMOST <> 0, True);
end;
Delphi-Quellcode:
implementation

uses Unit1;

procedure TForm2.FormActivate(Sender: TObject);
begin
  SetWindowPos(Handle, {Form1.Handle}HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
end;

procedure TForm2.Timer1Timer(Sender: TObject);
begin
  Caption := BoolToStr(GetWindowLong(Handle, GWL_EXSTYLE) and WS_EX_TOPMOST <> 0, True);
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat