如何在C#中捕捉鼠标事件 实现IMessageFilter接口,然后判断消息是否为鼠标操作,进行处理。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 转:一个微软工程师在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 } 这样就可以在子控件处理鼠标事件之前截获并处理之。不过,一般不推荐这样做,因为可能出现一些不稳定的情况。 请教:MYSQL连接数据库查询数据出问题 asp.net +access 关于gridview绑定的问题 serialport readline()乱码问题 兩個關於C#語句的問題 请教高人 如果判断一个值是否在某个范围之内? B/S的项目管理是不是用sharepoint???? WPF TypeConverterMarkupExtension 我写了一个windows应用程序,这里要保存一些参数,能不能把这些参数保存在这个应用程序中? 在WinFrom中改變DataGrid中對應行的顏色該怎樣做, 如何在.net环境进行Com+组件的客户端注册 初学者一个简单的问题,谢谢各位帮忙!!
一个微软工程师在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
}
这样就可以在子控件处理鼠标事件之前截获并处理之。不过,一般不推荐这样做,因为可能出现一些不稳定的情况。