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

时间:2010-05-19 14:48:09

标签: c# winforms mousewheel

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

我已经看过MouseWheel事件,但它不符合我的要求。在senes中,它总是给出Delta 120或-120的值,但我想根据鼠标滚动的速度调用一个函数,例如当我正常滚动鼠标时我想执行功能1并且当我滚动鼠标时非常我想快速执行功能2.换句话说,是否有任何方法可以区分鼠标滚动高速和正常速度。

任何建议都将受到赞赏。

3 个答案:

答案 0 :(得分:2)

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

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

事实上,你可以这样做:

在鼠标滚轮事件中启动一个计时器(带有指示慢速鼠标滚动的间隔),然后如果计时器熄灭执行功能1.如果在计时器关闭之前再次发生鼠标滚轮事件,则重置计时器并增加一个计数器(以便在你完成任务后跟踪轮子事件中的数字)然后启动第二个(更长的)计时器。如果计数器大于某个阈值则执行功能2.当第二个计时器过去时,重置计数器。沿着这些线条的某些东西应该能够让你在慢速车轮转动时启动功能1,并在车轮快速转动几次“点击”时启动功能。

这段代码应该给出我想到的那种东西(非常脏)。玩了一会后,我不确定这是一个很好的解决方案......

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;
    }

答案 1 :(得分:1)

查看Control.MouseWheel事件。

答案 2 :(得分:1)

根据Sam Holder的建议,我在这里发布了他的建议的修改版本,以帮助其他程序员面临同样的问题。

public partial class Form1 : Form
{
    int m_counter = 0;

    public Form1()
    {
        InitializeComponent();

        // Attach Mouse Wheel Event
        this.MouseWheel += new MouseEventHandler(Form1_MouseWheel);
    }

    void Form1_MouseWheel(object sender, MouseEventArgs e)
    {
        // Refresh Slow Timer
        slowTimer.Enabled = false;
        slowTimer.Stop();
        slowTimer.Interval = 150;
        slowTimer.Start();
        slowTimer.Enabled = true;

        // Incremenet counter
        m_counter++;

        // Start Fast Timer
        if (fastTimer.Enabled == false)
        {
            fastTimer.Enabled = true;
            fastTimer.Interval = 50;
            fastTimer.Start();
        }

        // If this returns true call
        // the fast scroll implementation
        if (m_counter > 4)
        {
            Console.WriteLine("Quick Method Called");
            m_counter = 0;
            fastTimer.Stop();
            slowTimer.Enabled = false;
            slowCheckTimer.Stop();
            slowCheckTimer.Interval = 200;
            slowCheckTimer.Start();
            slowCheckTimer.Enabled = true;
        }
    }

    private void slowTimer_Tick(object sender, EventArgs e)
    {            
        if (slowCheckTimer.Enabled == false)
        {
            Console.WriteLine("Slow Method Called");
        }

        slowTimer.Enabled = false;
    }

    private void fastTimer_Tick(object sender, EventArgs e)
    {
        fastTimer.Enabled = false;            
        m_counter = 0;
        fastTimer.Stop();
    }

    private void slowCheckTimer_Tick(object sender, EventArgs e)
    {            
        slowCheckTimer.Stop();
        slowCheckTimer.Enabled = false;
    }
}