fix(tray): a -tray launch does take the foreground, so give it back
FMX shows its taskbar proxy before we hide it, so the launching console was left inactive. GStartupForeground, captured in the unit initialization before any window of ours exists, holds it. A Windows-startup launch is unaffected: the foreground is a shell window there, which the capture filters out.
This commit is contained in:
+7
-5
@@ -335,15 +335,17 @@ garde refusait, à raison, de pré-remplir avec « Password Manager »).
|
|||||||
- **Ne pas « corriger » en envoyant deux Tab** : l'ordre de tabulation dépend de chaque site, un second Tab casserait tous les formulaires normaux.
|
- **Ne pas « corriger » en envoyant deux Tab** : l'ordre de tabulation dépend de chaque site, un second Tab casserait tous les formulaires normaux.
|
||||||
- **Historique** : la séquence envoyait `Ctrl+A + Del` avant **chaque** champ. Après le Tab c'était doublement mauvais : redondant (arriver par Tab sélectionne déjà tout le contenu du champ, cf. K1) et destructeur quand le Tab tombe sur un lien, un bouton ou le document — `Ctrl+A` sélectionne alors la page entière et la frappe se perd. Retiré ; celui d'avant le username reste (l'utilisateur y a placé le curseur par un clic, rien n'est sélectionné).
|
- **Historique** : la séquence envoyait `Ctrl+A + Del` avant **chaque** champ. Après le Tab c'était doublement mauvais : redondant (arriver par Tab sélectionne déjà tout le contenu du champ, cf. K1) et destructeur quand le Tab tombe sur un lien, un bouton ou le document — `Ctrl+A` sélectionne alors la page entière et la frappe se perd. Retiré ; celui d'avant le username reste (l'utilisateur y a placé le curseur par un clic, rien n'est sélectionné).
|
||||||
|
|
||||||
### H11 · l'application précédente réduite reste réduite
|
### H11 · l'application précédente réduite reste réduite ✅
|
||||||
- **ACTION** : depuis X, **réduire X** dans la barre des tâches → ouvrir le coffre (icône du tray) → le fermer par la croix.
|
- **ACTION** : depuis X, **réduire X** dans la barre des tâches → ouvrir le coffre (icône du tray) → le fermer par la croix.
|
||||||
- **ATTENDU** : X **reste réduite**. Le focus part où Windows décide ; on ne rouvre pas une fenêtre que l'utilisateur a rangée.
|
- **ATTENDU** : X **reste réduite**. Le focus part où Windows décide ; on ne rouvre pas une fenêtre que l'utilisateur a rangée.
|
||||||
- **Pourquoi c'est fragile** : `ForceForegroundWindow` fait `ShowWindow(SW_RESTORE)` sur une cible iconique — il est écrit pour l'autofill, où sortir la fenêtre cible est justement le but. Réutilisé tel quel pour la restitution du focus, il changeait l'état de la fenêtre d'une autre application. Garde `not IsIconic` posé côté `MinimizeToTray`, pas dans `ForceForegroundWindow` (l'autofill en a toujours besoin).
|
- **Pourquoi c'est fragile** : `ForceForegroundWindow` fait `ShowWindow(SW_RESTORE)` sur une cible iconique — il est écrit pour l'autofill, où sortir la fenêtre cible est justement le but. Réutilisé tel quel pour la restitution du focus, il changeait l'état de la fenêtre d'une autre application. Garde `not IsIconic` posé côté `MinimizeToTray`, pas dans `ForceForegroundWindow` (l'autofill en a toujours besoin).
|
||||||
|
|
||||||
### H12 · démarrage `-tray` — aucune activation parasite
|
### H12 · démarrage `-tray` — l'application qui lance garde le focus
|
||||||
- **ACTION** : ouvrir une application X, puis lancer `PMServer.exe -tray` (ou redémarrer avec « Start with Windows »).
|
- **ACTION** : depuis une console PowerShell, lancer `.\PMServer.exe -tray`.
|
||||||
- **ATTENDU** : rien ne passe au premier plan. Le coffre démarre caché sans toucher au focus de qui que ce soit — il n'a rien pris à personne, il n'a rien à rendre.
|
- **ATTENDU** : le coffre démarre caché **et la console garde son focus** (rectangle actif dans la barre des tâches).
|
||||||
- **Les quatre réglages de `MinimizeToTray`** (`AReturnForeground`) : fermeture par la croix = **rend** ; quick-search copie-puis-cache = **rend** (c'est ce qui permet le Ctrl+V dans l'app d'origine) ; autofill et annulation du picker = **ne rendent pas** (le focus est déjà sur la fenêtre remplie) ; démarrage `-tray` = **ne rend pas**.
|
- **ACTION 2** : « Start with Windows » / redémarrage → rien ne passe au premier plan.
|
||||||
|
- **Historique** : d'abord codé « rien à rendre, on n'a rien pris ». Faux : FMX affiche son proxy de barre des tâches avant qu'on le cache, donc le premier plan **est** pris un instant, et la console lançeuse restait inactive. La valeur utile est `GStartupForeground`, capturée à l'initialisation de l'unité — avant toute fenêtre à nous. Au démarrage de Windows, le premier plan est une fenêtre du shell, que la capture filtre : rien n'est activé, ce qui est le comportement voulu là.
|
||||||
|
- **Les quatre réglages de `MinimizeToTray`** (`AReturnForeground`) : fermeture par la croix = **rend** ; quick-search copie-puis-cache = **rend** (c'est ce qui permet le Ctrl+V dans l'app d'origine) ; démarrage `-tray` = **rend** ; autofill et annulation du picker = **ne rendent pas**, seuls cas où le focus a déjà été placé volontairement (sur la fenêtre remplie).
|
||||||
|
|
||||||
### H7 · combo déjà pris par une autre application ✅
|
### H7 · combo déjà pris par une autre application ✅
|
||||||
- **ACTION** : assigner à un hotkey un combo qu'une autre app tient déjà en global (ex. `Ctrl+Shift+Q` si Quick Assist / un lanceur l'occupe ; sinon, tester en assignant le même combo dans deux apps).
|
- **ACTION** : assigner à un hotkey un combo qu'une autre app tient déjà en global (ex. `Ctrl+Shift+Q` si Quick Assist / un lanceur l'occupe ; sinon, tester en assignant le même combo dans deux apps).
|
||||||
|
|||||||
@@ -369,9 +369,13 @@ begin
|
|||||||
TThread.ForceQueue(nil,
|
TThread.ForceQueue(nil,
|
||||||
procedure
|
procedure
|
||||||
begin
|
begin
|
||||||
// No foreground handback: a -tray launch never took the foreground from
|
// Hand the foreground back: a -tray launch DOES take it for a moment —
|
||||||
// anyone, so there is nobody to give it back to.
|
// FMX puts its taskbar proxy up before we hide it — so the application
|
||||||
FBridge.MinimizeToTray(True, False);
|
// that launched us (a console, Explorer) would otherwise be left
|
||||||
|
// inactive. GStartupForeground caught it before any window of ours
|
||||||
|
// existed. Nothing to give back on a Windows-startup launch: the
|
||||||
|
// foreground is then a shell window, which the capture filters out.
|
||||||
|
FBridge.MinimizeToTray(True, True);
|
||||||
// Hidden now — safe to pay the startup cost.
|
// Hidden now — safe to pay the startup cost.
|
||||||
btnStartClick(Nil);
|
btnStartClick(Nil);
|
||||||
LogLine('Launched with --tray, started hidden (balloon suppressed)');
|
LogLine('Launched with --tray, started hidden (balloon suppressed)');
|
||||||
|
|||||||
Reference in New Issue
Block a user