C# override WndProc in Control level to detect

谁说我不能喝 提交于 2020-02-02 13:11:10

问题


I have overridden WndProc in UserControl level to detect MouseDown, MouseUp, and MouseMove to any Control added in that UserControl.

protected override void WndProc(ref Message m)
    {
        Point mouseLoc = new Point();

        switch (m.Msg)
        {
            case WM_LBUTTONDOWN:
                System.Diagnostics.Debug.WriteLine("mouse down");
                //this.OnMouseDown(new MouseEventArgs(MouseButtons.Left, 1, mouseLoc.X, mouseLoc.Y, 0));

                break;
            case WM_LBUTTONUP:
                System.Diagnostics.Debug.WriteLine("mouse up");
                //this.OnMouseDown(new MouseEventArgs(MouseButtons.Left, 1, mouseLoc.X,mouseLoc.Y, 0));

                break;
            case WM_MOUSEMOVE:
                int lParam = m.LParam.ToInt32();

                //mouseLoc.X = lParam & 0xFFFF;
                //mouseLoc.Y = (int)(lParam & 0xFFFF0000 >> 16);

                mouseLoc.X = (Int16)m.LParam;
                mouseLoc.Y = (Int16)((int)m.LParam >> 16);

                System.Diagnostics.Debug.WriteLine("mouse move: " + mouseLoc.X + ", " + mouseLoc.Y);

                //this.OnMouseDown(new MouseEventArgs(MouseButtons.Left, 1, mouseLoc.X,mouseLoc.Y, 0));
                break;
        }

        base.WndProc(ref m);
    }

MouseMove, Down, and Up are working when the mouse pointer is in UserControl but when the mouse pointer is on other control (inside my UserControl) it doesn't work.

Am I doing something wrong?

Currently developing a flick and scroll control.


回答1:


This is how windows works - each control in winforms is a window, and mouse messages go to the window they are over. If you need to get the mouse input from other windows you need to cooperate them somehow.

Having said all of that, if all you want is a flick and scroll control, you should consider looking at the WM_GESTURE APIs - that is what they are for, and they will allow you to implement flick and scroll without any cooperation from your child windows.




回答2:


You're not doing anything "wrong", but Windows is simply sending the message to the correct control. It does not send the message to all the enclosing controls as well.

For key events there is the the Form.KeyPreview property, which allows the form to receive the events as well, but I'm not aware of anything similar for mouse events.



来源:https://stackoverflow.com/questions/2771034/c-sharp-override-wndproc-in-control-level-to-detect

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!