2010-05-19 95 views
2

有没有什么办法捕捉鼠标滚轮开始和停止之间的时间间隔?其实我想捕捉滚动开始和停止之间的间隔,当我非常快速地滚动鼠标滚轮。鼠标滚轮滚动 - 如何捕获滚动开始和停止之间的时间间隔?

我已经看过MouseWheel事件,但它不符合我的要求。在它总是给Delta 120或-120的价值,但我想调用一个函数,取决于鼠标滚动的速度,例如,当我通常滚动鼠标我想执行函数1,当我滚动鼠标非常快速我想执行的功能2.换句话说,有什么办法来区分鼠标滚动高和正常速度。

任何意见将不胜感激。

回答

2

你不能捕获鼠标滚轮事件,看看它们之间有多长时间。基本上,当你得到一个鼠标滚轮事件时启动一个计时器,然后在下一个事件中看到计时器在什么位置(以及事件之间已经过了多长时间),以确定车轮正在转向的速度?如果经过时间小于某个阈值,则执行功能2,如果速度超过某个阈值,则执行功能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; 
    } 
+0

你能指点我一个这样的东西的例子,因为我想这样做为每个滚动不是每个车轮转动,即一个完整的快速滚动后,我想刷新计时器。 – 2010-05-19 15:16:59

+0

你能否清楚“那么如果定时器关闭执行功能1”那个定时器的间隔是多少?谢谢你的帮助。 – 2010-05-19 15:28:17

+1

我没有一个例子,我只是提出了一个解决方案。您无法从单个事件中判断车轮转向的速度,您需要有多个事件来确定车轮是快速还是缓慢转弯。我建议先设置一些东西来确定两个事件之间的时间间隔,如果它<某个值,则向控制台“快速”打印,如果>某个值打印“慢” – 2010-05-19 15:42:00

1

看看在Control.MouseWheel事件。

+0

我已经看过它,但它不符合我的要求。在它总是给Delta 120或-120的价值,但我想调用一个函数,取决于鼠标滚动的速度,例如,当我通常滚动鼠标我想执行函数1,当我滚动鼠标非常快速我想执行的功能2.换句话说,有什么办法来区分鼠标滚动高和正常速度。 – 2010-05-19 14:56:00

1

正如萨姆持有我在这里发表自己的意见的修改优化版本,以帮助面临同样的问题其他程序员建议。

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