fix(startup): hide the taskbar proxy too, and trace the --tray timeline

The window still showed, taskbar entry included. Two things.

The taskbar button belongs to the FMX proxy window (TFMAppClass), a separate
top-level window from the form — hiding the form alone never removed it.
FindFMXAppWindow moves from private to public so the activate-hide can drop
both. (Guarded on Assigned(FBridge): the handler is installed at line 222,
the bridge is created at 268.)

And rather than guess a fourth time at FMX's startup order — the same trap as
the window-state saga, which only fell to instrumentation — this logs a
millisecond timeline: FormCreate begin/end, the activate-hide, and the
deferred MinimizeToTray. Whichever gap holds the second will be obvious.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
r-zakarya
2026-07-27 10:47:25 +01:00
parent eec7bc4f80
commit 0506d757dd
2 changed files with 18 additions and 3 deletions
+14 -2
View File
@@ -220,6 +220,7 @@ begin
begin
Visible := False;
OnActivate := TrayStartupHideOnce;
LogLine('[tray] FormCreate begin at ' + FormatDateTime('hh:nn:ss.zzz', Now));
end;
// The .fmx ships WindowState = wsMaximized, so that is the starting intent.
@@ -325,11 +326,13 @@ begin
// it's noise when Windows itself put us in the tray (the user
// didn't actively minimise). Manual launches still see it once.
FBridge.BalloonShown := True;
LogLine('[tray] FormCreate end at ' + FormatDateTime('hh:nn:ss.zzz', Now));
TThread.ForceQueue(nil,
procedure
begin
FBridge.MinimizeToTray;
LogLine('Launched with --tray, minimised at startup (balloon suppressed)');
LogLine('[tray] deferred MinimizeToTray ran at ' +
FormatDateTime('hh:nn:ss.zzz', Now));
end);
end;
end;
@@ -1600,13 +1603,22 @@ end;
procedure TMainForm.TrayStartupHideOnce(Sender: TObject);
var
LHwnd: HWND;
LHwnd, LAppHwnd: HWND;
begin
OnActivate := nil; // one shot — never fight the user afterwards
Visible := False;
LHwnd := WindowHandleToPlatform(Self.Handle).Wnd;
if LHwnd <> 0 then
ShowWindow(LHwnd, SW_HIDE);
// The taskbar entry belongs to the FMX proxy window, not the form — hiding
// the form alone leaves the button on the taskbar.
if Assigned(FBridge) then
begin
LAppHwnd := FBridge.FindFMXAppWindow;
if LAppHwnd <> 0 then ShowWindow(LAppHwnd, SW_HIDE);
end;
LogLine('[tray] activate-hide fired at ' +
FormatDateTime('hh:nn:ss.zzz', Now));
end;
// Single entry point for every tray restore. ExecuteAutofill really minimises