[FancyZones] Fix stuck drag state and swallowed keys when a window is destroyed mid-drag#48569
Conversation
- Subscribe to EVENT_OBJECT_DESTROY to clean up when dragged window dies mid-drag (root cause of microsoft#410) - Only suppress bare Shift key during drag, not all Shift+key combos - Require Win+Ctrl+Alt for quickLayoutSwitch during drag - Tag SwallowKey SendInput with dwExtraInfo Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The EVENT_OBJECT_DESTROY win-event was subscribed and mapped to WM_PRIV_WINDOWDESTROYED by the consumer, but FancyZonesApp's dispatch switch had no case for it, so the event was dropped at default: break and the stuck-drag fix never ran. Forward EVENT_OBJECT_DESTROY to the callback alongside the other window-lifecycle events. When the dragged window is destroyed mid-drag, the WM_PRIV_WINDOWDESTROYED handler called MoveSizeEnd(), which snaps the now-dead HWND into a zone and corrupts layout state. Abort the drag instead via a new WindowMouseSnap::Abort() that tears down overlays/highlights/transparency without snapping, then resets the snapper and disables dragging state. Drop the redundant 'shift &&' term from the bare-Shift swallow: in a WH_KEYBOARD_LL hook GetAsyncKeyState(VK_SHIFT) is not yet set on the initial Shift-down, so the first press leaked through to the app. The explicit VK_LSHIFT/VK_RSHIFT vkCode check already scopes this to the bare Shift key. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@check-spelling-bot Report🔴 Please reviewSee the 📂 files view, the 📜action log, 👼 SARIF report, or 📝 job summary for details.
See ❌ Event descriptions for more information. Some files were automatically ignored 🙈These sample patterns would exclude them: You should consider adding them to: File matching is via Perl regular expressions. To check these files, more of their words need to be in the dictionary than not. You can use To update file exclusions, you could run the following commands... in a clone of the git@github.com:crutkas/autoUpgradeAttempt.git repository curl -s -S -L 'https://raw.githubusercontent.com/check-spelling/check-spelling/cfb6f7e75bbfc89c71eaa30366d0c166f1bd9c8c/apply.pl' |
perl - 'https://github.com/microsoft/PowerToys/actions/runs/27451213326/attempts/1' &&
git commit -m 'Update check-spelling metadata'Forbidden patterns 🙅 (1)In order to address this, you could change the content to not match the forbidden patterns (comments before forbidden patterns may help explain why they're forbidden), add patterns for acceptable instances, or adjust the forbidden patterns themselves. These forbidden patterns matched content: Should be
|
Summary
Fixes a class of "stuck drag" bugs in FancyZones where closing or destroying a window while it is being dragged leaves FancyZones in a half-dragging state — zone overlays stay on screen and subsequent keystrokes (notably number keys) are swallowed or misrouted.
What this changes
EVENT_OBJECT_DESTROY.FancyZonesAppnever subscribed to the destroy event, and the consumer'sWM_PRIV_WINDOWDESTROYEDbranch could therefore never fire. The event is now registered and routed throughHandleWinHookEvent.WM_PRIV_WINDOWDESTROYED, if the destroyed HWND is the one being dragged, call the newWindowMouseSnap::Abort()(tears down overlays/highlights/transparency) instead ofMoveSizeEnd(), which would try to snap the now-dead HWND and corrupt zone state. Dragging state is then disabled.MoveSizeEnd(), even when the snapper was already null, so the state can't get stranded.draggingwas true; if drag state was stuck this "stole" number keys from the focused app. This is the root-cause fix for the number-key-stealing symptom.Shift+<other>combos, so real keystrokes are no longer eaten by an in-progress drag.Testing
main.This is one of a small set of related "stuck key / stuck state" hardening fixes; each stands alone.