@@ -129,6 +129,13 @@ struct FancyZones : public winrt::implements<FancyZones, IFancyZones, IFancyZone
129129 PostMessageW (m_window, WM_PRIV_WINDOWCREATED , wparam, lparam);
130130 }
131131 break ;
132+
133+ case EVENT_OBJECT_DESTROY :
134+ if (data->idObject == OBJID_WINDOW )
135+ {
136+ PostMessageW (m_window, WM_PRIV_WINDOWDESTROYED , wparam, lparam);
137+ }
138+ break ;
132139 }
133140 }
134141
@@ -342,9 +349,12 @@ void FancyZones::MoveSizeEnd()
342349 if (m_windowMouseSnapper)
343350 {
344351 m_windowMouseSnapper->MoveSizeEnd ();
345- m_draggingState.Disable ();
346352 m_windowMouseSnapper = nullptr ;
347353 }
354+
355+ // Always disable dragging state, even if m_windowMouseSnapper was already null.
356+ // This prevents stuck drag state when a window is destroyed mid-drag.
357+ m_draggingState.Disable ();
348358}
349359
350360bool FancyZones::MoveToAppLastZone (HWND window, HMONITOR monitor, GUID currentVirtualDesktop) noexcept
@@ -505,7 +515,9 @@ FancyZones::OnKeyDown(PKBDLLHOOKSTRUCT info) noexcept
505515
506516 bool dragging = m_draggingState.IsDragging ();
507517 bool changeLayoutWhileNotDragging = !dragging && !shift && win && ctrl && alt && digitPressed != -1 ;
508- bool changeLayoutWhileDragging = dragging && digitPressed != -1 ;
518+ // Require Win+Ctrl+Alt even while dragging to prevent accidental layout switches
519+ // when drag state is stuck (root cause of #410 "steals number keys")
520+ bool changeLayoutWhileDragging = dragging && win && ctrl && alt && digitPressed != -1 ;
509521
510522 if (changeLayoutWhileNotDragging || changeLayoutWhileDragging)
511523 {
@@ -519,7 +531,10 @@ FancyZones::OnKeyDown(PKBDLLHOOKSTRUCT info) noexcept
519531 }
520532 }
521533
522- if (m_draggingState.IsDragging () && shift)
534+ // Only suppress the bare Shift key itself during drag (used for drag-toggle).
535+ // Do NOT swallow Shift+<other key> combos - that steals keystrokes from apps.
536+ if (m_draggingState.IsDragging () && shift &&
537+ (info->vkCode == VK_LSHIFT || info->vkCode == VK_RSHIFT ))
523538 {
524539 return true ;
525540 }
@@ -699,6 +714,16 @@ LRESULT FancyZones::WndProc(HWND window, UINT message, WPARAM wparam, LPARAM lpa
699714 auto hwnd = reinterpret_cast <HWND >(wparam);
700715 WindowCreated (hwnd);
701716 }
717+ else if (message == WM_PRIV_WINDOWDESTROYED )
718+ {
719+ auto hwnd = reinterpret_cast <HWND >(wparam);
720+ // If the destroyed window was being dragged, force-end the drag
721+ if (m_windowMouseSnapper && m_windowMouseSnapper->GetDraggedWindow () == hwnd)
722+ {
723+ Logger::info (L" Window destroyed during drag - forcing MoveSizeEnd" );
724+ MoveSizeEnd ();
725+ }
726+ }
702727 else if (message == WM_PRIV_LAYOUT_HOTKEYS_FILE_UPDATE )
703728 {
704729 LayoutHotkeys::instance ().LoadData ();
0 commit comments