当前位置: 首页 > 编程语言 > C#

鼠标滚轮事件(C#)分享

时间:2023-04-10 23:02:13 C#

鼠标滚轮事件(C#)主窗体获取不到鼠标滚轮事件。作为演示,我想出了一个简单的例子:publicpartialclassForm1:Form{publicForm1(){InitializeComponent();this.panel1.MouseWheel+=newMouseEventHandler(panel1_MouseWheel);this.panel1.MouseMove+=newMouseEventHandler(panel1_MouseWheel);Form2f2=newForm2();f2.Show(这个);}privatevoidpanel1_MouseWheel(objectsender,MouseEventArgse){if(e.Delta!=0)Console.Out.WriteLine(e.Delta);}}publicpartialclassForm2:Form{publicForm2(){InitializeComponent();this.MouseMove+=newMouseEventHandler(Form2_MouseMove);this.MouseWheel+=newMouseEventHandler(Form2_MouseMove);e){if(e.Delta!=0)Console.Out.WriteLine(e.Delta);我在Form2中获得鼠标滚轮事件但在Form1中没有任何想法?干杯,詹姆斯我怀疑只要鼠标在面板上,OP就想获得滚动事件,即使面板没有焦点。实现这种行为的方法在这里解释:http://social.msdn.microsoft.com/forums/en-US/winforms/thread/eb922ed2-1036-41ca-bd15-49daed7b637c/和这里:http://social.msdn.microsoft.com/forums/en-US/winforms/thread/6bfb9287-986d-4c60-bbcc-23486e239384/摘自链接论坛的片段之一:usingSystem;使用System.ComponentModel;使用系统绘图;使用System.Windows.Forms;使用System.Runtime.InteropServices;namespaceWindowsApplication1{publicpartialclassForm1:Form,IMessageFilter{publicForm1(){InitializeComponent();Application.AddMessageFilter(这个);}publicboolPreFilterMessage(refMessagem){if(m.Msg==0x20a){//WM_MOUSEWHEEL,在屏幕位置找到控件m.LParamPointpos=newPoint(m.LParam.ToInt32()&0xffff,m.LParam.ToInt32()>>16);IntPtrhWnd=WindowFromPoint(pos);if(hWnd!=IntPtr.Zero&&hWnd!=m.HWnd&&Control.FromHandle(hWnd)!=null){SendMessage(hWnd,m.Msg,m.WParam,m.LParam);返回真;}}返回假;}//P/调用声明[DllImport("user32.dll")]privatestaticexternIntPtrWindowFromPoint(Pointpt);[DllImport("user32.dll")]privatestaticexternIntPtrSendMessage(IntPtrhWnd,intmsg,IntPtrwp,IntPtrlp);}}这段代码基本上会拦截所有的wm_mousewheel事件并将它们重定向到鼠标当前悬停的控制面板不再需要有焦点来接收滚轮事件。您的问题来自具有焦点的form1,而不是panel1。...哪个方面意味着将触发form1的事件,而不是panel1的事件。我重新创建了您的场景,对Form1中的构造函数进行了以下更改,并验证了它是否触发了wheel事件。publicForm1(){InitializeComponent();/*---旧代码不起作用---this.panel1.MouseWheel+=newMouseEventHandler(panel1_MouseWheel);this.panel1.MouseMove+=newMouseEventHandler(panel1_MouseWheel);*/this.MouseWheel+=newMouseEventHandler(panel1_MouseWheel);this.MouseMove+=newMouseEventHandler(panel1_MouseWheel);Form2f2=newForm2();f2.Show(这个);在其回调函数中获取输入焦点:voidMouseEnterEvent(){this.Panel.Focus();感谢@nitrogenycs的回答,我写了一个简单的泛型类来轻松解决这个问题:usingSystem;使用System.Windows。使用System.Runtime.InteropServices;使用系统绘图;命名空间MyNamespace{publicclassMouseWheelManagedForm:Form,IMessageFilter{privateboolmanaged;publicMouseWheelManagedForm():this(true){}publicMouseWheelManagedForm(boolstart){falsemanaged=;如果(开始)ManagedMouseWheelStart();}protectedoverridevoidDispose(booldisposing){if(disposing)ManagedMouseWheelStop();base.Dispose(处置);}/****************************************IMessageFilter实现*************************************/privateconstintWM_MOUSEWHEEL=0x20a;//P/Invoke声明[DllImport("user32.dll")]privatestaticexternIntPtrWindowFromPoint(Pointpt);[DllImport("user32.dll")]privatestaticexternIntPtrSendMessage(IntPtrhWnd,intmsg,IntPtrwp,IntPtrlp);privateboolIsChild(Controlctrl){控制loopCtrl=ctrl;while(loopCtrl!=null&&loopCtrl!=this)loopCtrl=loopCtrl.Parent;返回(loopCtrl==this);}publicboolPreFilterMessage(refMessagem){if(m.Msg==WM_MOUSEWHEEL){//确保消息被发送到当前窗体的子级if(IsChild(Control.FromHandle(m.HWnd))){//找到屏幕位置的控件m.LParamPointpos=newPoint(m.LParam.ToInt32()&0xffff,m.LParam.ToInt32()>>16);//确保鼠标下的控件有效且不是目标控件//otherw是我们会陷入循环。IntPtrhWnd=WindowFromPoint(pos);if(hWnd!=IntPtr.Zero&&hWnd!=m.HWnd&&Control.FromHandle(hWnd)!=null){SendMessage(hWnd,m.Msg,m.WParam,m.LParam);返回真;}}}返回假;}/*****************************************MouseWheelManagedForm具体方法****************************************/publicvoidManagedMouseWheelStart(){if(!managed){managed=true;Application.AddMessageFilter(这个);}}publicvoidManagedMouseWheelStop(){if(managed){managed=false;Application.RemoveMessageFilter(这个);从那里,您只需要从此类继承您的Form而不是Form,因为您需要“管理”MouseWheel的每种形式:usingSystem;使用System.Collections.Generic;使用系统数据;使用System.Linq;使用System.Windows.Forms;namespaceMyApp{publicpartialclassMyForm:MyNamespace.MouseWheelManagedForm{publicMyForm(){InitializeComponent();希望这能帮助别人(而不是我)也许这对你有用?publicpartialclassForm1:Form{publicForm1(){InitializeComponent();Form2f2=newForm2();f2.MouseWheel+=newMouseEventHandler(panel1_MouseWheel);f2.MouseMove+=newMouseEventHandler(panel1_MouseWheel);f2.Show(这个);}privatevoidpanel1_MouseWheel(objectsender,MouseEventArgse){if(e.Delta!=0)Console.Out.WriteLine(e.Delta);面板本身没有焦点,只有放置在面板内的项目才有焦点。只有在面板中放置了某些东西并且该东西具有焦点后,面板才会接收MouseWheel事件。只需将鼠标悬停在面板上并移动鼠标滚轮即可将事件发送到表单,而不是面板。这是两个例子的区别。我想你有点误解了我的问题。在我的主窗体上使用以下代码我没有得到MouseWheel事件:publicForm1(){InitializeComponent();this.panel1.MouseWheel+=newMouseEventHandler(panel1_MouseWheel);this.panel1.MouseMove+=newMouseEventHandler(panel1_MouseWheel);但是我确实得到了以下事件:publicForm1(){InitializeComponent();this.MouseWheel+=newMouseEventHandler(panel1_MouseWheel);我希望它没有Form2的混淆更清楚。我只是想在我的主窗体中的面板上获取MouseWheel事件。Cheers,James以上就是C#学习教程:鼠标滚轮事件(C#)分享的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——this.MouseWheel+=pictureBox1_MouseWheel;//tan?mlamavoidpictureBox1_MouseWheel(objectsender,MouseEventArgse){if(Convert.ToString(e.Delta)=="120"){//yukar?}elseif(Convert.ToString(e.Delta)=="-120"){//a?a??}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: