这是我收集的一个微软工程师在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
}这样就可以在子控件处理鼠标事件之前截获并处理之。不过,一般不推荐这样做,因为可能出现一些不稳定的情况。

解决方案 »

  1.   

    谢谢。
    在POPMENU控件里它就很好的处理了各种事件,比如ESC键等,只要有其他事件发生POPMENU都会很好的响应,并消失,那么POPMENU是怎样解决这样的控制问题呢
      

  2.   

    TheAres(班门斧) :
    看到你的关注太好了,发了N天都每人理。
    其实是这样的,你就想象成POPMENU,在你的鼠标点击任何地方的时候他都会消失,那么POPMENU是怎样得到你的鼠标事件。
    我正在做的就是类似POPMENU的一个控件
      

  3.   

    TheAres(班门斧)说的没错,popmenu也是通过类似的方法实现的
    再发生鼠标点击事件时,预先接受事件,处理完了之后继续发送出来
      

  4.   

    其实这个问题用Control.Capture属性可以得到很好的解决,
    把这个属性设为true后,所有的鼠标时间都会传到该Control,
      

  5.   

    不好意思,上面有一点错误
    其实这个问题用Control.Capture属性可以得到很好的解决,把这个属性设为true后,所有的鼠标事件都会传到该Control,只是MouseEventHandler.X,Y可能是负数或者大于长宽的数字,这样说明鼠标是在控件外面按下的.
      

  6.   

    TheAres那种循环写事件的方法解决了问题,虽然有点傻(要递归的将每个控件的子控件)
     
    阿炳 的方法好象有点问题,当你的鼠标点到CONTROL的子控件时会有什么结果,是不是MouseEventHandler.x,y也为负数呢,我没试过,希望可以讨论,分很快就给,大家可以先再聊聊