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
multiple 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;