实现IMessageFilter接口,然后判断消息是否为鼠标操作,进行处理。

解决方案 »

  1.   

    转:
    一个微软工程师在CSDN的回答。  
     
    -----------------------------  
    的确有很多开发人员问过同样的问题,就是“WinForm中,键盘事件可以通过Form.KeyPreview捕捉,那么鼠标事件有没有Form.MousePreview?”。首先,直接的答案是没有。但是,另外有一些效果类似的解决方法,比如可以在Form_Load的时候遍历所有的Form.Controls,为每一个Control添加同一个鼠标处理函数。  
     
    另外一个方法是使用Mouse  Hook。您可以在WinForm程序中添加如下的代码:  
     
    [DllImport(  "kernel32  ")]  
    public  static  extern  int  GetCurrentThreadId();  
     
    [DllImport(    "user32  ",  CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]  
    public  static  extern  int    SetWindowsHookEx(HookType  idHook,HOOKPROC  lpfn,int  hmod,int  dwThreadId);  
     
    public  enum  HookType{  
               WH_MOUSE  =  7  
    }  
     
    public  delegate  int  HOOKPROC(int  nCode,  int  wParam,  int            lParam);  
     
    public  void  SetHook(HOOKPROC  callbackProc){  
               SetWindowsHookEx(HookType.WH_MOUSE,callbackProc,0,GetCurrentThreadId());  
    }  
     
    private  void  Form1_Load(object  sender,  System.EventArgs  e){  
               SetHook(new  HOOKPROC(this.MyMouseProc));  
    }  
     
    public  int  MyMouseProc(int  nCode,  int  wParam,  int  lParam){  
               if(nCode==0  &&  wParam==514){  //if  left  button  down.  
                           MessageBox.Show(  "Mouse  left  button  clicked.  LParam=  "+lParam);  
               }  
               return  0;  //return  1  to  trap  the  mouse  event  
    }  
     
    这样就可以在子控件处理鼠标事件之前截获并处理之。不过,一般不推荐这样做,因为可能出现一些不稳定的情况。