fix(tray): relancer l'exe ramene bien la fenetre au premier plan

Lancee, fermee par la croix (tray), puis relancee : la fenetre revenait
derriere les autres, seule son icone dans la barre des taches. Mesure :
visible, non minimisee, pas au premier plan.

La 2e instance, qui recoit le double-clic, reveille la 1re par un
message ; mais la 1re n'a recu aucune entree, et Windows lui refuse
SetForegroundWindow. La 2e cede maintenant son droit
(AllowSetForegroundWindow) avant d'envoyer le message.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
r-zakarya
2026-09-17 06:20:17 +01:00
parent d8f4f19041
commit d41dbfbb3a
@@ -69,6 +69,15 @@ begin
CloseHandle(_Mutex); CloseHandle(_Mutex);
_Mutex := 0; _Mutex := 0;
end; end;
// CEDER LE PREMIER PLAN AVANT DE REVEILLER L'AUTRE. C'est NOUS qui venons de
// recevoir le double-clic de l'utilisateur, donc nous seuls avons le droit de
// passer devant. Sans cette cession, l'instance deja lancee — qui n'a recu
// aucune entree — se voit refuser SetForegroundWindow par Windows : sa
// fenetre se montre DERRIERE les autres, avec seulement son icone dans la
// barre des taches. Mesure avant correctif : visible, non minimisee, pas au
// premier plan. Tous processus parce que le PID de l'autre instance n'est pas connu
// ici ; le droit cede expire a la prochaine entree utilisateur.
AllowSetForegroundWindow(DWORD(-1)); // ASFW_ANY, absent de Winapi.Windows
PostMessage(HWND_BROADCAST, WM_PMShowMessage, 0, 0); PostMessage(HWND_BROADCAST, WM_PMShowMessage, 0, 0);
Result := False; Result := False;
end; end;