这是Windows消息机制的问题,当你的鼠标点击form时就会产生WM_LBUTTONDOWN消息,该消息首先被TranslateMessage,然后被系统DiapatchMessage到相应的控件,所以当点击控件时消息不会被form处理,当然form的处理函数也接收不到该消息。解决办法:MFC里可以重写PreTranslateMessage方法来得到该消息。C#里我没找到此方法,最底层的可能就是WndProc了,所以只能用比较笨的方法,就是把你要做的事写成函数,为每个在该form上的控件处理该消息,调用你的函数。希望有帮助。
good luck

解决方案 »

  1.   

    我现在只好对每个控件调用同样的click事件了,感觉这样做有点蠢蠢的,呵呵
      

  2.   

    的确有很多开发人员问过同样的问题,就是“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
    }这样就可以在子控件处理鼠标事件之前截获并处理之。不过,一般不推荐这样做,因为可能出现一些不稳定的情况。
    Hogwarts - S(u)ddenly dis@ppeared...

    本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利。具体事项可参见使用条款(http://support.microsoft.com/directory/worldwide/zh-cn/community/terms_chs.asp)。