Oto nieco prostsza wersja, która nie polega na zegarku. Wystarczy nagrać czas ostatniego ruchu myszy, aby porównać bieżący czas, gdy chcesz sprawdzić, czy mysz jest unoszona.
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;
}
}
Lub naprawdę krótka wersja, która nie ma tolerancji odległości.
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;
}
Po prostu użyj, jeśli (IsHovering()) ... kiedy musisz sprawdzić, czy mysz się porusza.
Jedną z rzeczy, które zauważyłem jest to, że MouseMove nie jest uruchamiany podczas przeciągania. Możesz jednak skopiować kod myszy mouseMoveTime/Loc do zdarzenia przeciągania, aby obejść to.
Czy możesz wyjaśnić? Czy chcesz wydarzenie za każdym razem, gdy zmieniają się współrzędne x/y, gdy jest on zawieszony nad formantem? –
Chcę uzyskać wydarzenie za każdym razem, gdy mysz przestaje się poruszać. Poddaję się również zdarzeniu MouseMove, ale muszę wiedzieć, kiedy mysz przestaje się poruszać. Czy jest inny sposób, aby to zrobić niż przy użyciu zdarzenia MouseHover? –