Aquí hay una versión un poco más simple que no depende de un temporizador. Simplemente registre la hora del último movimiento del mouse y luego compare la hora actual cada vez que quiera verificar si el mouse está moviendo el mouse.
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;
}
}
O una versión realmente corta que no tiene una tolerancia de distancia.
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;
}
sólo tiene que utilizar si (IsHovering()) ... cuando es necesario comprobar si el ratón se está moviendo.
Una cosa que he notado es que MouseMove no se dispara cuando estás arrastrando. Sin embargo, puede copiar el código de actualización mouseMoveTime/Loc a su evento de arrastre para evitar esto.
¿Puedes aclarar? ¿Desea un evento cada vez que las coordenadas x/y cambian cuando está sobre su control? –
Deseo obtener un evento cada vez que el mouse deje de moverse. También engancho el evento MouseMove, pero necesito saber cuándo deja de moverse el mouse. ¿Hay alguna otra forma de hacer esto que usar el evento MouseHover? –