Ecco una versione leggermente più semplice che non si basa su un timer. Basta registrare l'ora dell'ultima mossa del mouse per confrontare l'ora corrente ogni volta che si desidera controllare se il mouse è in bilico.
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 versione veramente breve che non ha una tolleranza di distanza.
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;
}
Basta usare if (IsHovering()) ... quando è necessario controllare se il mouse è in movimento.
Una cosa che ho notato è che MouseMove non viene attivato durante il trascinamento. Puoi comunque copiare il codice di aggiornamento mouseMoveTime/Loc all'evento di trascinamento per aggirare questo problema.
fonte
2016-03-10 14:31:44
Potete chiarire? Vuoi un evento ogni volta che le coordinate x/y cambiano quando passa il mouse sopra il tuo controllo? –
Voglio ottenere un evento ogni volta che il mouse si ferma. Ho anche agganciato l'evento MouseMove, ma ho bisogno di sapere quando il mouse si ferma. C'è un altro modo per farlo rispetto all'utilizzo dell'evento MouseHover? –