码迷,mamicode.com
首页 > Windows程序 > 详细

C#在Win10与非Win10 Windows系统鼠标滚动编程的一点区别。

时间:2018-03-07 15:02:08      阅读:246      评论:0      收藏:0      [点我收藏+]

标签:form   write   解决   else   编程   nta   log   事件   term   

C#在win10和非Win10上处理鼠标滚动有一些区别,建一个Form1,放置一个FlowLayoutPanel ,类型的Panel1

Panel.MouseWheel += PanelOnMouseWheel;

private void PanelOnMouseWheel(object sender, MouseEventArgs mouseEventArgs)
 {
     if (mouseEventArgs.Delta < 0)
             ScrollBar.Value = ScrollBar.Value == ScrollBar.Maximum ? ScrollBar.Maximum : ++ScrollBar.Value;
         else
             ScrollBar.Value = ScrollBar.Value == ScrollBar.Minimum ? ScrollBar.Minimum : --ScrollBar.Value;
     
 }

以上代码在win10上,只要鼠标在Panel1客户区范围内,那么滚动鼠标滚轮时,就能触发滚动事件,但是在非win10上,如果焦点不在Panel上,比如在Form1窗体一个Button上,那么就不能触发滚动事件。

解决办法

        [DllImport("user32.dll")]
        public static extern IntPtr GetFocus();

需要判断焦点按钮是否是本窗口子控件,使用IMessageFilter。

       const int WM_MOUSEWHEEL = 0x020A;
        public bool PreFilterMessage(ref Message msg)
        {
            
            
            if (msg.Msg == WM_MOUSEWHEEL)
            {
                if ((CheckControl(this.Parent, GetFocus())))
                {
                    int wpara = (int)msg.WParam;
                    if ((wpara & 0x80000000) == 0x80000000)//向下
                        ScrollBar.Value = ScrollBar.Value == ScrollBar.Maximum ? ScrollBar.Maximum : ++ScrollBar.Value;
                    else
                        ScrollBar.Value = ScrollBar.Value == ScrollBar.Minimum ? ScrollBar.Minimum : --ScrollBar.Value;
                    
                }
                return false;
            }
            return false;
        }
public bool CheckControl(Control control, IntPtr handle)
        {
            if (control == null)
                return false;
            try
            {
                for (int i = 0; i < control.Controls.Count; i++)
                {
                    var v = control.Controls[i];
                    if (handle == v.Handle)
                    {
                        return true;
                    }
                    else
                    {
                        if (v.Controls.Count > 0)
                        {
                            if (CheckControl(v, handle))
                            {
                                return true;
                            }
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                return false;
            }
            return false;
        }

如果有更好的解决办法请指点。

C#在Win10与非Win10 Windows系统鼠标滚动编程的一点区别。

标签:form   write   解决   else   编程   nta   log   事件   term   

原文地址:https://www.cnblogs.com/zhaogaojian/p/8521928.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!