Событие MouseHover/MouseLeave во всем окне

У меня есть подкласс Form с обработчиками для MouseHover и MouseLeave. Когда указатель находится на фоне окна, события работают нормально, но когда указатель перемещается на элемент управления внутри окна, он вызывает событие MouseLeave.

В любом случае, есть ли событие, охватывающее все окно.

(.NET 2.0, Visual Studio 2005, Windows XP.)


person billpg    schedule 06.01.2010    source источник


Ответы (4)


Когда запускается событие ухода мыши, один из вариантов — проверить текущую позицию указателя и посмотреть, находится ли он в области формы. Я не уверен, доступен ли лучший вариант.

Редактировать: у нас есть аналогичный вопрос, который может вас заинтересовать. Как определить, находится ли мышь внутри всей формы и дочерних элементов управления в C#?

person Shoban    schedule 06.01.2010
comment
Поэтому, если я зарегистрирую один и тот же обработчик для MouseEnter и MouseLeave для всех элементов управления внутри окна (включая внутренние панели), тогда этот обработчик будет проверять положение мыши, чтобы обнаружить изменение внутри/снаружи и вызвать реальный вход/выход из обработчика. Хорошая идея, спасибо. - person billpg; 06.01.2010
comment
Я добавил пример того, как использовать только одно событие MouseEnter и MouseLeave для всей формы. Дайте мне знать, если это сработает для вас - person SwDevMan81; 06.01.2010
comment
Хорошая идея. Но если содержащийся элемент управления находится на границе, это не сработает. (Отдайте должное здесь пользователю, который это заметил.) - person ispiro; 29.12.2013

Переключите событие MouseLeave, чтобы оно не запускалось, пока мышь входит в дочерний элемент управления.

    protected override void OnMouseLeave(EventArgs e)
    {
        if (this.ClientRectangle.Contains(this.PointToClient(Control.MousePosition)))
            return;
        else
        {
            base.OnMouseLeave(e);
        }
    }
person Ryan    schedule 30.08.2012

Не существует хорошего способа сделать MouseLeave надежным для элемента управления контейнера. Решите эту задачу с помощью таймера:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        timer1.Interval = 200;
        timer1.Tick += new EventHandler(timer1_Tick);
        timer1.Enabled = true;
    }

    private bool mEntered;

    void timer1_Tick(object sender, EventArgs e) {
        Point pos = this.PointToClient(Cursor.Position);
        bool entered = this.ClientRectangle.Contains(pos);
        if (entered != mEntered) {
            mEntered = entered;
            if (!entered) {
                // Do your leave stuff
                //...
            }
        }
    }
}
person Hans Passant    schedule 06.01.2010

В вашем пользовательском элементе управления создайте событие mousehover для вашего элемента управления, подобное этому (или другому типу события), подобное этому

private void picBoxThumb_MouseHover(object sender, EventArgs e)
{
    // Call Parent OnMouseHover Event
    OnMouseHover(EventArgs.Empty);
}

В вашей WinForm, на которой размещен UserControl, есть это для UserControl для обработки MouseOver, поэтому поместите это в свой Designer.cs

this.thumbImage1.MouseHover += new System.EventHandler(this.ThumbnailMouseHover);

Который вызывает этот метод в вашей WinForm

private void ThumbnailMouseHover(object sender, EventArgs e)
{

    ThumbImage thumb = (ThumbImage) sender;

}

Где ThumbImage — тип пользовательского элемента управления.

person fkerrigan    schedule 08.04.2011