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.