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