C# 检测光标是否在控件的边界内

C# 检测光标是否在控件的边界内,c#,winforms,C#,Winforms,我有一个用户控件 public partial class UserControl1 : UserControl, IMessageFilter { public UserControl1() { InitializeComponent(); Application.AddMessageFilter(this); } public bool PreFilterMessage(ref Message m) {

我有一个用户控件

public partial class UserControl1 : UserControl, IMessageFilter
{
    public UserControl1()
    {
        InitializeComponent();
        Application.AddMessageFilter(this);
    }

    public bool PreFilterMessage(ref Message m)
    {
        var mouseLocation = Cursor.Position;

        if (Bounds.Contains(PointToClient(mouseLocation)))
        {
            bool aBool = true;//breakpoint
            bool two = aBool;//just assignment so compiler doesn't optimize my bool out
        }
        if (m.Msg != 0x20a) // Scrolling Message
        {
            return false;//ignore message
        }
        return false;
    }
}
当我浮动在父窗体中包含的用户控件上时,不会命中断点。断点在很近的地方被击中,但我可以在用户控件内的实际文本框中,而不会被击中。我如何才能准确地确定我是否在该用户控件的范围内


我有两个监视器。我使用的监视器似乎没有什么区别。

仅为了快速技巧,您可以用一个事件触发所有userconrol控件,并处理鼠标悬停事件。 例如,如果用户控件中有两个文本框

    textBox1.MouseMove += new MouseEventHandler(controls_MouseMove);
    textBox2.MouseMove += new MouseEventHandler(controls_MouseMove);
    ...

    void controls_MouseMove(object sender, MouseEventArgs e)
    {
        Control subc=sender as Control;
        int mouseX = MousePosition.X;
        ....
    }

尝试对控件而不是
控件进行命中测试。界限

if (ClientRectangle.Contains(PointToClient(Control.MousePosition))) {
    bool aBool = true;//breakpoint 
    bool two = aBool;
}

@DanielA.White的可能副本我在您的链接中看到的答案特定于单个控件。注意,这里我连接到一个全局消息过滤器。我认为这些都行不通。最后,我需要确切地知道鼠标在哪个控件上,而不仅仅是包含子控件的一般用户控件。请记住,至少有些控件在收到鼠标按下事件时会触发mousemove事件。我发现解决这个问题的最好方法是在mouse move的事件处理程序中仔细检查鼠标指针是否确实在控制范围之外。如果这是来自
MouseEventArgs
的,您甚至可以从中获取
Location
属性,而不使用
PointToClient