Подтвердить что ты не робот

Определить, находится ли курсор в пределах элемента управления

У меня есть пользовательский элемент управления

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

Когда я плаваю над пользовательским элементом управления, содержащимся в родительской форме, точка останова не попадает. Точка останова попадает в непосредственной близости, но я могу находиться в фактическом текстовом поле внутри пользовательского элемента управления и не получать удар. Как я могу точно определить, находится ли я в пределах этого пользовательского элемента управления?

FWIW, у меня есть два монитора. Кажется, это не влияет на то, какой монитор я использую.

4b9b3361

Ответ 1

Попробуйте протестировать хит Control.ClientRectangle, а не Control.Bounds:

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

Ответ 2

просто для быстрого трюка. Вы можете запускать все элементы управления userconrol с одним событием и обрабатывать мышь над событиями. например, если у вас было два текстовых поля в вашем usercontrol

    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;
        ....
    }