File: System\Windows\Forms\Controls\ToolStrips\ToolStrip.RestoreFocusMessageFilter.cs
Web Access
Project: src\src\System.Windows.Forms\System.Windows.Forms.csproj (System.Windows.Forms)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
namespace System.Windows.Forms;
 
public partial class ToolStrip
{
    internal sealed class RestoreFocusMessageFilter : IMessageFilter
    {
        private readonly ToolStrip _ownerToolStrip;
 
        public RestoreFocusMessageFilter(ToolStrip ownerToolStrip)
        {
            _ownerToolStrip = ownerToolStrip;
        }
 
        public bool PreFilterMessage(ref Message m)
        {
            if (_ownerToolStrip.Disposing || _ownerToolStrip.IsDisposed || _ownerToolStrip.IsDropDown)
            {
                return false;
            }
 
            // if the app has changed activation, restore focus
 
            switch (m.MsgInternal)
            {
                case PInvokeCore.WM_LBUTTONDOWN:
                case PInvokeCore.WM_RBUTTONDOWN:
                case PInvokeCore.WM_MBUTTONDOWN:
                case PInvokeCore.WM_NCLBUTTONDOWN:
                case PInvokeCore.WM_NCRBUTTONDOWN:
                case PInvokeCore.WM_NCMBUTTONDOWN:
                    if (_ownerToolStrip.ContainsFocus)
                    {
                        // If we've clicked on something that's not a child of the toolstrip and we currently have focus, restore it.
                        if (!PInvoke.IsChild(_ownerToolStrip, m.HWND))
                        {
                            HWND rootHwnd = PInvoke.GetAncestor(_ownerToolStrip, GET_ANCESTOR_FLAGS.GA_ROOT);
                            if (rootHwnd == m.HWND || PInvoke.IsChild(rootHwnd, m.HWND))
                            {
                                // Only RestoreFocus if the hwnd is a child of the root window and isn't on the toolstrip.
                                RestoreFocusInternal();
                            }
                        }
                    }
 
                    return false;
 
                default:
                    return false;
            }
        }
 
        private void RestoreFocusInternal()
        {
            _ownerToolStrip.BeginInvoke(new BooleanMethodInvoker(_ownerToolStrip.RestoreFocusInternal), [ToolStripManager.ModalMenuFilter.InMenuMode]);
            Application.ThreadContext.FromCurrent().RemoveMessageFilter(this);
        }
    }
}