[.NET]让Panel对Mouse滚轮事件(Wheel)有感觉,而且能触发Scroll事件

之前有写了一篇“让Panel对Mouse滚轮事件(Wheel)有感觉”,是透过 SendMessage 的方式去叫 Panel Scroll。

但是却不会触发Panel的Scroll事件。那怎么办呢?

在之前有写了一篇“让Panel对Mouse滚轮事件(Wheel)有感觉”,是透过 SendMessage 的方式去叫 Panel Scroll。

但是却不会触发Panel的Scroll事件。那怎么办呢?

所以我们可以透过Control.FromHandle来取到那个控件,然后再触发该控件的Scroll事件,如下,


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form, IMessageFilter
    {

        // P/Invoke declarations
        [DllImport("user32.dll")]
        private static extern IntPtr WindowFromPoint(Point pt);

        [DllImport("user32.dll")]
        private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);

        public Form1()
        {
            InitializeComponent();
            Application.AddMessageFilter(this);
        }

        public bool PreFilterMessage(ref Message m)
        {
            if (m.Msg == 0x20a)
            {
                // WM_MOUSEWHEEL, find the control at screen position m.LParam
                Point pos = new Point(m.LParam.ToInt32() & 0xffff, m.LParam.ToInt32() >> 16);
                IntPtr hWnd = WindowFromPoint(pos);
                if (hWnd != IntPtr.Zero && hWnd != m.HWnd && Control.FromHandle(hWnd) != null)
                {
                    //取得控件
                    ScrollableControl ctrl = Control.FromHandle(hWnd) as ScrollableControl;
                    int orgValue = 0;
                    if (ctrl != null)
                    {
                        //取得控件垂直ScrollBar的值
                        orgValue = ctrl.VerticalScroll.Value;
                    }
                    SendMessage(hWnd, m.Msg, m.WParam, m.LParam);
                    if (ctrl != null)
                    {
                        //取得控件垂直ScrollBar的值
                        int newValue = ctrl.VerticalScroll.Value;
                        var se = new ScrollEventArgs(ScrollEventType.ThumbTrack, orgValue, newValue
                            , ScrollOrientation.VerticalScroll);
                        FireScrollEvent(ctrl, se);
                    }
                    return true;
                }
            }
            return false;
        }

        ///

        /// 触发控件的Scroll事件
        /// 

        ///
        ///
        private void FireScrollEvent(ScrollableControl sc, ScrollEventArgs e)
        {
            MethodInfo onScroll = sc.GetType().GetMethod("OnScroll",
                System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
            onScroll.Invoke(sc, new object[] { e });
        }
    }
}

参考数据

让Panel对Mouse滚轮事件(Wheel)有感觉

Control.FromHandle

WinForms: How to programatically fire an event handler?

原文:大专栏  [.NET]让Panel对Mouse滚轮事件(Wheel)有感觉,而且能触发Scroll事件

原文地址:https://www.cnblogs.com/petewell/p/11526647.html

时间: 2024-08-01 21:14:38

[.NET]让Panel对Mouse滚轮事件(Wheel)有感觉,而且能触发Scroll事件的相关文章

扩展jquery scroll事件,支持 scroll start 和 scroll stop

参考地址: http://www.ghugo.com/special-scroll-events-for-jquery/ javascript里有一个事件是滚动事件,只要拖动滚动条,就会触发事件. 用jquery的话,这个事件scroll 可以查看jquery api :http://api.jquery.com/scroll/ 但scroll 事件有一个缺陷,就是只能判断滚动条滚动,而不能监控滚动条停止滚动时的事件. 现用jquery扩展一下scroll 事件,新增 不多说,直接上代码实在点.

解决移动端页面滚动后不触发touchend事件

解决移动端页面滚动后不触发touchend事件 问题 在移动端页面进行优化时,一般使用touch事件替代鼠标相关事件.用的较多的是使用touchend事件替代PC端的click和mouseup事件. 可是,touchend事件在页面滚动时有个问题.在滚动完毕后,假设当前触点的位置所指的元素绑定了touchend事件,这时便会触发该元素的touchend事件,造成误操作. 解决方法 解决方法非常easy.就是在页面滚动时停止touchend事件冒泡.这样就能够防止触发touchend事件. 用法

写一个事件(不仅仅是为控件添加事件)------------C#

最近看书上有关于事件的内容,之前在写winform时,事件都是直接用的,对内部的写法并不了解. 这里将自定义一个事件. 首先,写一个类. public class NewMailEventArgs:EventArgs//这个类以后是事件的参数,用于传递事件的一些附加信息.但是必须继承EventArgs { private readonly string m_from, m_to, m_subject; public NewMailEventArgs(string from,string to,s

jquery双击事件(dblclick)时,不触发单击事件(click)

在jQuery的事件绑定中,执行双击事件(dblclick)时能触发两次单击事件(click).即一个标签元素(如div等),如果元素同时绑定了单击事件(click)和双击事件(dblclick),那么执行单击事件(click)时,不会触发双击事件(dblclick), 执行双击事件(dblclick)时却会触发两次单击事件(click). 先看一下点击事件的执行顺序: 单击(click):mousedown,mouseout,click: 双击(dblclick):mousedown,mous

jQuery事件:scroll事件

scroll事件:滚动元素时或者是使用scroll()方法会触发scroll事件 scroll()方法 触发选中元素的scroll事件 $(selector).scroll()//无参数 规定scroll事件被触发后的函数 $(selector).scroll( function ) function:js Function对象 详情

[转]jQuery 双击事件(dblclick)时,不触发单击事件(click)

例1: 链接:http://www.w3school.com.cn/jquery/event_dblclick.asp HTML 系列教程 浏览器脚本 服务器脚本 ASP.NET 教程 XML 系列教程 Web Services 系列教程 建站手册 jQuery 教程 jQuery 教程 jQuery 简介 jQuery 安装 jQuery 语法 jQuery 选择器 jQuery 事件 jQuery 效果 jQuery 隐藏/显示 jQuery 淡入淡出 jQuery 滑动 jQuery 动画

jQuery 双击事件(dblclick)时,不触发单击事件(click)

在jQuery的事件绑定中,执行双击事件(dblclick)时能触发两次单击事件(click).即一个标签元素(如div等),如果元素同时绑定了单击事件(click)和双击事件(dblclick),那么执行单击事件(click)时,不会触发双击事件(dblclick), 执行双击事件(dblclick)时却会触发两次单击事件(click). 先看一下点击事件的执行顺序: 单击(click):mousedown,mouseout,click: 双击(dblclick):mousedown,mous

“如何稀释scroll事件”引出的问题

背景:我在segmentfault提了个问题如何稀释onscroll事件,问题如下: 面试时问到这个问题,是这样的:    面试官问一个关于滚动到某个位置的时候出现一个顶部的导航栏,答完之后,她接着问一滚动onscroll就会执行很多很多次,如何稀释它?为了确定她说的是“稀释”,我让她重复了遍,我给出的解决方法是,用一个变量,在事件处理的时候让它自增,判断达到一定大小就执行一次实际的事件: var i = 0; // 累积变量 window.onscroll = function(){ i++;

mui.fire()触发自定义事件

导读:添加自定义事件监听操作和标准js事件监听类似,可直接通过window对象添加,通过mui.fire()方法可触发目标窗口的自定义事件. 监听自定义事件 添加自定义事件监听操作和标准js事件监听类似,可直接通过window对象添加,如下: window.addEventListener('customEvent',function(event){  //通过event.detail可获得传递过来的参数内容    .... }); 触发自定义事件 通过mui.fire()方法可触发目标窗口的自