有没有办法捕捉鼠标滚轮滚动开始和停止之间的时间间隔?实际上,当我非常快速地滚动鼠标滚轮时,我想捕捉滚动开始和停止之间的间隔。
我已经看过 MouseWheel 事件,但它不能满足我的要求。从某种意义上说,它总是给出 Delta 120 或 -120 的值,但我想根据鼠标滚动的速度调用一个函数,例如,当我正常滚动鼠标时,我想执行功能 1,而当我非常滚动鼠标时很快我想执行功能2。换句话说,有什么方法可以区分鼠标滚动高速和正常速度。
任何建议将被认真考虑。
有没有办法捕捉鼠标滚轮滚动开始和停止之间的时间间隔?实际上,当我非常快速地滚动鼠标滚轮时,我想捕捉滚动开始和停止之间的间隔。
我已经看过 MouseWheel 事件,但它不能满足我的要求。从某种意义上说,它总是给出 Delta 120 或 -120 的值,但我想根据鼠标滚动的速度调用一个函数,例如,当我正常滚动鼠标时,我想执行功能 1,而当我非常滚动鼠标时很快我想执行功能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;
}
看一下Control.MouseWheel事件。
正如 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;
}
}