Вот немного более простая версия, которая не использует таймер. Просто запишите время последнего движения мыши, а затем сравните текущее время всякий раз, когда вы хотите проверить, зависает ли мышь.
private DateTime mouseMoveTime = DateTime.Now;
private Point mouseMoveLoc = new Point();
private bool IsHovering()
{
return (mouseMoveTime.AddMilliseconds(SystemInformation.MouseHoverTime)).CompareTo(DateTime.Now) < 0;
}
private void myControl_MouseMove(object sender, MouseEventArgs e)
{
// update mouse position and time of last move
if (Math.Abs(e.X - mouseMoveLoc.X) > SystemInformation.MouseHoverSize.Width ||
Math.Abs(e.Y - mouseMoveLoc.Y) > SystemInformation.MouseHoverSize.Height)
{
mouseMoveLoc = new Point(e.X, e.Y);
mouseMoveTime = DateTime.Now;
}
}
Или действительно короткая версия, не имеющая допуска на расстояние.
private DateTime mouseMoveTime = DateTime.Now;
private bool IsHovering()
{
return (mouseMoveTime.AddMilliseconds(SystemInformation.MouseHoverTime)).CompareTo(DateTime.Now) < 0;
}
private void myControl_MouseMove(object sender, MouseEventArgs e)
{
mouseMoveTime = DateTime.Now;
}
Просто используйте if (IsHovering ()) ... когда вам нужно проверить, движется ли мышь.
Одна вещь, которую я заметил, это то, что MouseMove не срабатывает при перетаскивании. Однако вы можете скопировать код обновления mouseMoveTime / Loc в событие перетаскивания, чтобы обойти это.