c# - 鼠标滚轮滚动 - 如何捕获滚动开始和停止之间的时间间隔?

标签 c# winforms mousewheel

有没有办法捕获鼠标滚轮滚动开始和停止之间的时间间隔?实际上,我想捕获当我快速滚动鼠标滚轮时滚动开始和停止之间的间隔。

我已经查看了 MouseWheel 事件,但它不能满足我的要求。在某种意义上,它总是给出 Delta 120 或 -120 的值,但我想根据鼠标滚动的速度调用一个函数,例如,当我正常滚动鼠标时,我想执行函数 1,当我非常滚动鼠标时,我想执行函数 1。我想快速执行功能2。换句话说,有什么方法可以区分鼠标滚动的高速和正常速度。

如有任何建议,我们将不胜感激。

最佳答案

您不能捕获鼠标滚轮事件并查看它们之间的时间间隔吗?基本上,当您收到鼠标滚轮事件时启动计时器,然后在下一个事件中查看计时器的位置(以及事件之间经过了多长时间)以确定滚轮转动的速度?如果耗时小于某个阈值,则执行功能2,如果快于某个阈值,则执行功能1。

如果计时器关闭,您可能必须将其设置为执行功能 1,以防它们只执行一次滚动。

事实上,您可以这样做:

在鼠标滚轮事件中启动一个计时器(具有指示缓慢鼠标滚轮的间隔),然后如果计时器关闭,则执行功能1。如果在计时器关闭之前再次发生鼠标滚轮事件,则重置计时器并执行功能1。增加一个计数器(以跟踪自从您执行操作以来车轮事件的数量),然后启动第二个(更长的)计时器。如果计数器大于某个阈值,则执行功能 2。当第二个计时器到期时,重置计数器。按照这些思路,您应该能够在车轮缓慢转动时启动功能 1,并在通过几次“点击”快速转动车轮时启动功能 2。

这段代码应该给出(非常肮脏的)我正在考虑的事情的指示。玩了一会儿后,我不太确定这是一个好的解决方案......

private void mouseWheelHandler (object sender, MouseEventArgs e)
    {
    slowTimer.Enabled = false;
    slowTimer.Stop ();            
    slowTimer.Interval = 200;
    slowTimer.Start();
    slowTimer.Enabled = true;
    m_counter++;
    Trace.WriteLine(string.Format("counter={0}", m_counter));
    if (fastTimer.Enabled==false)
        {
        fastTimer.Enabled = true;
        fastTimer.Interval = 150;
        fastTimer.Start ();
        }
    if (m_counter>5)
        {
        Trace.WriteLine("called method 2");
        m_counter = 0;
        fastTimer.Stop ();
        slowTimer.Enabled = false;
        slowCheckTimer.Stop ();                
        slowCheckTimer.Interval = 250;
        slowCheckTimer.Start();
        slowCheckTimer.Enabled = true;
        }
    }

private void slowTimer_Tick(object sender, EventArgs e)
    {
    Trace.WriteLine("slow timer ticked");
    if (slowCheckTimer.Enabled==false)
        {
        Trace.WriteLine ("called method 1");
        }

    slowTimer.Enabled = false;
    }

private void fastTimer_Tick(object sender, EventArgs e)
    {
    fastTimer.Enabled = false;
    Trace.WriteLine("fast timer ticked");
    m_counter = 0;
    fastTimer.Stop ();
    }

private void slowCheckTimer_Tick(object sender, EventArgs e)
    {
    Trace.WriteLine("slow check timer ticked");
    slowCheckTimer.Stop ();
    slowCheckTimer.Enabled = false;
    }

关于c# - 鼠标滚轮滚动 - 如何捕获滚动开始和停止之间的时间间隔?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2866605/

相关文章:

c# - 如何在不阻止GUI的情况下等待多个任务?

java - MouseWheel 事件不会在 SWT-AWT 组件中触发

c# - 子域的重写规则未触发

c# - 发送多个并行 Web 请求

c# - 如何正确停止BackgroundWorker

JavaScript:鼠标滚轮事件在文本框上方时不会触发

c# - C# 中的 GET_WHEEL_DELTA_WPARAM 宏

c# - typeof(DateTime?).Name == Nullable`1

c# - .NET Core 控制台应用程序的 WebApplicationFactory 是否有等效项?

C++ CLR 不会在调试之外编译