Я также использую System.Windows.Forms.Timer для этого решения, но я больше не использую события ввода / вывода мыши. Они причинили мне слишком много горя. Вместо этого я использую событие MouseMove для компонента, который должен знать, что мышь окончена. У меня есть 2 переменные-члены, названные в этом классе.
bool Hovering = false;
System.Drawing.Point LastKnownMousePoint = new System.Drawing.Point();
В моем случае я хотел переключить границу вокруг метки. Я имею дело со знанием, находится ли мышь над контролем надписи, о котором я забочусь следующим образом:
private void label1_MouseMove(object sender, MouseEventArgs e)
{
// Mouse Position relative to the form... not the control
LastKnownMousePoint = Cursor.Position;
label1.BorderStyle = BorderStyle.Fixed3D;
timer1.Stop();
timer1.Interval = 50; // Very fast (Overkill? :) )
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
System.Drawing.Point point = Cursor.Position;
if (LastKnownMousePoint.Equals(point))
{
// If the mouse is somewhere on the label, I'll call that Hovering.
// Though not technically the MS definition, it works for me.
Hovering = true;
}
else if (Hovering == false)
{
label1.BorderStyle = BorderStyle.None;
timer1.Stop();
}
else
{
Hovering = false;
// Next time the timer ticks, I'll stop the timer and
// Toggle the border.
}
}
Это работает, потому что я обновляю LastKnownMousePoint только тогда, когда мышь находится над элементом управления (в данном случае метка). Поэтому, если мышь перемещается за пределы элемента управления, я не буду обновлять LastKnownMousePoint, и я буду знать, что пришло время переключать стиль границы.