|
// 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);
}
}
}
|