我觉得有个问题,不能说忽略它,而应该是如何使MDI子窗体永远在其它子窗体的最底层,可以获得焦点,但是不能覆盖在其它窗体之上

解决方案 »

  1.   

    这个方法比较复杂,我就不写代码了,只将思路告诉你:写一个消息过滤类,实现系统的IMessageFilter接口,在你的MDI子窗体中实例化这个接口,Application.AddMessageFilter(接口的实例)这样,这个过滤类就生效了;至于你要忽略的消息,要在过滤类的
     PreFilterMessage(ref Message m)方法中处理(这是IMessageFilter接口中定义的方法):
    比如你要忽略513号消息:
    public bool PreFilterMessage(ref Message m)
    {
      if (m.Msg == 513) 
      {
         return false;
      }
    }
      

  2.   

    不好部门,我刚才的倒数第三行应为:
    return true;如果return true;这个消息就被过滤掉了!
      

  3.   

    重写 DefWndProc 方法不可以吗?(我没有遇到过MDI子窗体的问题)
    关注,帮你顶一下,但“忽略”意为何解?
      

  4.   

    请问楼上如何重写WndProc?关键的地方是哪点?
      

  5.   

    对于消息的忽略,肯定要用过滤,WndPro只以能得到窗体上的每一个消息,可以在消息到来时,干你想干的事情,但当你收到这个消息时,已经不能阻止它的发生,这是一个事后机制!wndpro的重写方法如下:
    protected override void WndProc(ref Message m)
    {
    base.WndProc(ref m);
    if (m.Msg >500 && m.Msg <520)
    {
               this.textBox1.AppendText(m.Msg.ToString());
    }
    }
      

  6.   

    我不同意楼上的观点“当你收到这个消息时,已经不能阻止它的发生”
    只要不返回 base.DefWndProc(ref m);系统就不会接收到这个消息
      

  7.   

    在C#中有的时候需要对控件的消息进行预处理,你可以通过C#提供的一个接口 
    IMessageFilter来实现消息的过滤 
    public class Form1: System.Windows.Forms.Form,IMessageFilter 

     const int WM_MOUSEMOVE = 0x200 
     public bool PreFilterMessage(ref Message m)  
     {  Keys keyCode = (Keys)(int)m.WParam & Keys.KeyCode;  
       if(m.Msg == m.Msg==WM_MOUSEMOVE) //||m.Msg == WM_LBUTTONDOWN 
       { 
        //MessageBox.Show("Ignoring Escape...");   
        return true;  
       }  
        return false;  
     } 
    } true 筛选消息并防止消息被调度;false 则允许消息继续到达下一个筛选器或控件。