有没有办法捕捉鼠标滚轮启动和停止之间的时间间隔?实际上,当我非常快速地滚动鼠标滚轮时,我想捕捉滚动开始和停止之间的间隔。
我已经看过MouseWheel事件,但它不符合我的要求。在senes中,它总是给出Delta 120或-120的值,但我想根据鼠标滚动的速度调用一个函数,例如当我正常滚动鼠标时我想执行功能1并且当我滚动鼠标时非常我想快速执行功能2.换句话说,是否有任何方法可以区分鼠标滚动高速和正常速度。
任何建议都将受到赞赏。
答案 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;
}
}