none
IMessageFilter.PreFilterMessage 方法没有执行 RRS feed

  • 问题

  • 我写了一个类,继承了IMessageFilter接口,但是PreFilterMessage这个方法没有执行。

     

        public class MyMessageFilter : IMessageFilter
        {
            private Control control = null;
            private Boolean isMove = true;

            public MyMessageFilter(Control control)
            {
                this.control = control;
            }

            #region IMessageFilter 成员

            public bool PreFilterMessage(ref Message m)
            {
                if (m.Msg == (int)Msgs.WM_MOUSEMOVE)
                {
                    move();
                }
                else if (m.Msg == (int)Msgs.WM_LBUTTONUP)
                    isMove = false;
                else if (m.Msg == (int)Msgs.WM_CAPTURECHANGED)
                    isMove = false;
                else if (m.Msg == (int)Msgs.WM_KEYDOWN && (int)m.WParam == (int)Keys.Escape)
                    isMove = false;

                return false;
            }

            private void move()
            {
                if (isMove)
                {
                    control.Top = Control.MousePosition.Y;
                    control.Left = Control.MousePosition.X;
                }
            }

            #endregion

        }


    这样调用的   Application.AddMessageFilter(new MyMessageFilter(button1));


    snyod
    2010年7月21日 8:36

答案

  • 我在WinForm里试验过了(VS2005),没有问题。效果是按钮随着鼠标移动。

            public class MyMessageFilter : IMessageFilter
            {
                private Control control = null;
                private Boolean isMove = true;
                public MyMessageFilter(Control control)
                {
                    this.control = control;
                }
                public bool PreFilterMessage(ref Message m)
                {
                    if (m.Msg == 0x200)
                    {
                        move();
                    }
                    else if (m.Msg == 0x202)
                        isMove = false;
                    else if (m.Msg == 0x215)
                        isMove = false;
                    else if (m.Msg == 0x0100 && (int)m.WParam == (int)Keys.Escape)
                        isMove = false;
                    return false;
                }
                private void move()
                {
                    if (isMove)
                    {
                        control.Top = Control.MousePosition.Y;
                        control.Left = Control.MousePosition.X;
                    }
                }
            }
            private void Form1_Load(object sender, EventArgs e)
            {
                Application.AddMessageFilter(new MyMessageFilter(button1));

    2010年7月21日 13:16

全部回复

  • Application.AddMessageFilter(IMessageFilter) 是在哪里执行的?把它放到 Application.Run(Form) 之前试试看。
    Mark Zhou
    2010年7月21日 8:41
  • 我是在MyMessageFilter类里实现的,

    这个类里还有一个鼠标单击事件,在鼠标单击事件里调用的。


    snyod
    2010年7月21日 9:58
  • 我在WinForm里试验过了(VS2005),没有问题。效果是按钮随着鼠标移动。

            public class MyMessageFilter : IMessageFilter
            {
                private Control control = null;
                private Boolean isMove = true;
                public MyMessageFilter(Control control)
                {
                    this.control = control;
                }
                public bool PreFilterMessage(ref Message m)
                {
                    if (m.Msg == 0x200)
                    {
                        move();
                    }
                    else if (m.Msg == 0x202)
                        isMove = false;
                    else if (m.Msg == 0x215)
                        isMove = false;
                    else if (m.Msg == 0x0100 && (int)m.WParam == (int)Keys.Escape)
                        isMove = false;
                    return false;
                }
                private void move()
                {
                    if (isMove)
                    {
                        control.Top = Control.MousePosition.Y;
                        control.Left = Control.MousePosition.X;
                    }
                }
            }
            private void Form1_Load(object sender, EventArgs e)
            {
                Application.AddMessageFilter(new MyMessageFilter(button1));

    2010年7月21日 13:16
  • 要不你把 public bool PreFilterMessage(ref Message m) 改成 bool IMessageFilter.PreFilterMessage(ref Message m) 显式实现试试?
    2010年7月21日 13:27