diff --git a/src/System.Windows.Forms/System/Windows/Forms/Controls/ToolStrips/ToolStrip.cs b/src/System.Windows.Forms/System/Windows/Forms/Controls/ToolStrips/ToolStrip.cs index fe4cd132f92..6e0c698d38b 100644 --- a/src/System.Windows.Forms/System/Windows/Forms/Controls/ToolStrips/ToolStrip.cs +++ b/src/System.Windows.Forms/System/Windows/Forms/Controls/ToolStrips/ToolStrip.cs @@ -3934,7 +3934,7 @@ internal override void ReleaseUiaProvider(HWND handle) /// contains ToolStrip or ToolStripDropDown items to disconnect internal virtual void ReleaseToolStripItemsProviders(ToolStripItemCollection items) { - ToolStripItem[] itemsArray = [..items.Cast()]; + ToolStripItem[] itemsArray = [.. items.Cast()]; foreach (ToolStripItem toolStripItem in itemsArray) { if (toolStripItem is ToolStripDropDownItem dropDownItem && dropDownItem.DropDownItems.Count > 0) @@ -4579,14 +4579,24 @@ protected override void WndProc(ref Message m) { SnapFocus((HWND)(nint)m.WParamInternal); + if (IsDropDown) + { + // Designer SmartTag panels are hosted in ToolStripDropDown. Keep these + // participating in modal menu tracking regardless of previous focus. + ToolStripManager.ModalMenuFilter.SetActiveToolStrip(this); + } + // Only activate ModalMenuFilter when focus transfers // between ToolStrips (to fix #12916). // Do NOT activate on generic Tab focus (#14489). - HWND previousFocus = (HWND)(nint)m.WParamInternal; - Control? previousControl = FromChildHandle(previousFocus); - if (previousControl is ToolStrip || previousControl?.Parent is ToolStrip) + else { - ToolStripManager.ModalMenuFilter.SetActiveToolStrip(this); + HWND previousFocus = (HWND)(nint)m.WParamInternal; + Control? previousControl = FromChildHandle(previousFocus); + if (previousControl is ToolStrip || previousControl?.Parent is ToolStrip) + { + ToolStripManager.ModalMenuFilter.SetActiveToolStrip(this); + } } } @@ -4594,16 +4604,21 @@ protected override void WndProc(ref Message m) { // Clear modal menu tracking when focus leaves ToolStrip context so // keyboard input is not incorrectly routed after tabbing away. - HWND nextFocus = (HWND)(nint)m.WParamInternal; - Control? nextControl = FromChildHandle(nextFocus); - if (ToolStripManager.ModalMenuFilter.GetActiveToolStrip() == this - && nextControl is not ToolStrip - && nextControl?.Parent is not ToolStrip) - { - ToolStripManager.ModalMenuFilter.RemoveActiveToolStrip(this); - if (ToolStripManager.ModalMenuFilter.GetActiveToolStrip() is null) + // Keep ToolStripDropDowns in menu tracking while they remain visible (for + // example, designer SmartTag panels that may temporarily transfer focus). + if (!IsDropDown) + { + HWND nextFocus = (HWND)(nint)m.WParamInternal; + Control? nextControl = FromChildHandle(nextFocus); + if (ToolStripManager.ModalMenuFilter.GetActiveToolStrip() == this + && nextControl is not ToolStrip + && nextControl?.Parent is not ToolStrip) { - ToolStripManager.ModalMenuFilter.ExitMenuMode(); + ToolStripManager.ModalMenuFilter.RemoveActiveToolStrip(this); + if (ToolStripManager.ModalMenuFilter.GetActiveToolStrip() is null) + { + ToolStripManager.ModalMenuFilter.ExitMenuMode(); + } } } }