fix(autofill): la barrette reste au-dessus, et se traine depuis ses boutons

TOPMOST n'est pas un rang, c'est une bande. La barre des taches y est
aussi, et cliquer son fond vide la remonte en tete de cette bande : une
barrette posee dessus passe DERRIERE et semble avoir disparu. Le meme
battement de 200 ms la repose.

Traine depuis un bouton : les boutons sont subclasses, et DragDetect
tranche entre clic et glissement en respectant le seuil regle par
l'utilisateur. Sur un clic, on envoie BN_CLICKED a la place du bouton -
DragDetect a avale le WM_LBUTTONUP, lui rendre la main le laisserait
enfonce pour toujours.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
r-zakarya
2026-08-26 17:27:38 +01:00
parent 9ce07ae5d0
commit 6b908e73a5
2 changed files with 63 additions and 2 deletions
+12
View File
@@ -206,6 +206,18 @@ Détails :
détruirait le `NOACTIVATE` qui la fait fonctionner. Deux portes vers ce menu —
`WM_NCRBUTTONUP` (le fond est non-client à cause de `HTCAPTION`) et
`WM_CONTEXTMENU` (remonté par les boutons).
- **`TOPMOST` n'est pas un rang, c'est une bande** : la barre des tâches y est
aussi, et cliquer son fond vide la remonte en tête de cette bande — une
barrette posée dessus passe **derrière** et semble avoir disparu. Le même
battement de 200 ms la repose (`SetWindowPos … SWP_NOMOVE or SWP_NOSIZE`) ;
sans mouvement ni taille à changer, l'appel ne repeint rien.
- **Traîner depuis un bouton** : les boutons sont subclassés (`GWLP_WNDPROC`,
une seule proc d'origine — même classe). Sur `WM_LBUTTONDOWN`, **`DragDetect`**
tranche entre clic et glissement en respectant le seuil réglé par
l'utilisateur. Glissement → `ReleaseCapture` + `WM_SYSCOMMAND, SC_MOVE or
HTCAPTION`. Clic → on **envoie `BN_CLICKED` à la place du bouton** : DragDetect
a avalé le `WM_LBUTTONUP`, lui rendre la main le laisserait enfoncé pour
toujours. Le clic droit n'est pas intercepté, donc le menu d'opacité tient.
- Le survol est **sondé** par un `SetTimer` de 200 ms, pas par `TrackMouseEvent` :
avec quatre fenêtres enfants, passer de la barrette à un bouton envoie déjà un
`WM_MOUSELEAVE` au parent. Comparer le curseur au rectangle ignore ce piège.