如何在一个FORM中捕获应用程序中的的所有鼠标点击事件

如何在一个FORM中捕获应用程序中的的所有鼠标点击事件

我自己制作了一个控件,但需要象POPMENU一样,在鼠标在任何地方点击后就自动释放,我要怎样在控件中才可以捕获到这个鼠标事件
---------------------------------------------------------------

这是我收集的一个微软工程师在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
}

这样就可以在子控件处理鼠标事件之前截获并处理之。不过,一般不推荐这样做,因为可能出现一些不稳定的情况。

---------------------------------------------------------------

这个我也没有试过,很有可能子控件的消息不会传到父控件,我没有试过,如果是不会传的话,也可以通过上面的方法组合来使用。

Published At
Categories with Web编程
Tagged with
comments powered by Disqus