How to detect if the mouse is inside the whole form and child controls?

前端 未结 4 1676
长发绾君心
长发绾君心 2020-12-06 02:23

I need to detect when the user moves the mouse over the Form and all its child controls and also when it leaves the Form. I tried the MouseEnter and Mouse

相关标签:
4条回答
  • 2020-12-06 03:07

    How about this: In your form's OnLoad, recursively go through all of the child controls (and their children) and hook up the MouseEnter event.

    Then whenever the mouse enters any descendant, the event handler will be called. Similarly, you could hook up MouseMove and/or MouseLeave events.

    protected override void OnLoad()
    {
       HookupMouseEnterEvents(this);
    }
    
    private void HookupMouseEnterEvents(Control control)
    {
       foreach (Control childControl in control.Controls)
       {
          childControl.MouseEnter += new MouseEventHandler(mouseEnter);
    
          // Recurse on this child to get all of its descendents.
          HookupMouseEnterEvents(childControl);
       }
    }
    
    0 讨论(0)
  • 2020-12-06 03:15

    On your user control create a mousehover Event for your control like this, (or other event type) like this

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

    On your WinFrom which hosts the UserControl have this for the UserControl to Handle the MouseOver in your Designer.cs

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

    Which calls this method on your WinForm

    private void ThumbnailMouseHover(object sender, EventArgs e)
    {
    
        ThumbImage thumb = (ThumbImage) sender;
    
    }
    

    Where ThumbImage is the type of usercontrol

    0 讨论(0)
  • 2020-12-06 03:18

    You can hook the main message loop and preprocess/postprocess any (WM_MOUSEMOVE) message what you want.

    public class Form1 : Form {
        private MouseMoveMessageFilter mouseMessageFilter;
        protected override void OnLoad(EventArgs e) {
            base.OnLoad( e );
    
            this.mouseMessageFilter = new MouseMoveMessageFilter();
            this.mouseMessageFilter.TargetForm = this;
            Application.AddMessageFilter(this.mouseMessageFilter);
        }
    
        protected override void OnClosed(EventArgs e) {
            base.OnClosed(e);
            Application.RemoveMessageFilter(this.mouseMessageFilter);
        }
    
        private class MouseMoveMessageFilter : IMessageFilter {
            public Form TargetForm { get; set; }
    
            public bool PreFilterMessage( ref Message m ) {
                int numMsg = m.Msg;
                if ( numMsg == 0x0200 /*WM_MOUSEMOVE*/)
                    this.TargetForm.Text = string.Format($"X:{Control.MousePosition.X}, Y:{Control.MousePosition.Y}");
    
                return false;
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-06 03:20

    Quick and dirty solution:

    private bool MouseInControl(Control ctrl)
    {
        return ctrl.Bounds.Contains(ctrl.PointToClient(MousePosition));
    }
    
    0 讨论(0)
提交回复
热议问题