I have a form with a lot of controls on it. How can I detect when the mouse leaves the form? I've tried wiring up a MouseLeave event for every single control and the form, but that does not work because those events fire all the time as the mouse passes over controls. Is there a way that actually works.?
The only reliable way I know of is a timer. Here's sample code that tweaks the opacity on a roll-over:
public partial class Form1 : Form {
Timer timer1 = new Timer();
public Form1() {
InitializeComponent();
this.Opacity = 0.10;
timer1.Tick += new EventHandler(timer1_Tick);
timer1.Interval = 200;
timer1.Enabled = true;
}
void timer1_Tick(object sender, EventArgs e) {
Point pos = Control.MousePosition;
bool inForm = pos.X >= Left && pos.Y >= Top && pos.X < Right && pos.Y < Bottom;
this.Opacity = inForm ? 0.99 : 0.10;
}
}
You should listen:
Just link your listeners to a function that checks whether the cursor is in the forms client are or not.
Try this:
protected override void OnControlAdded(ControlEventArgs e)
{
SubscribeEvents(e.Control);
base.OnControlAdded(e);
}
protected override void OnControlRemoved(ControlEventArgs e)
{
UnsubscribeEvents(e.Control);
base.OnControlRemoved(e);
}
private void SubscribeEvents(Control control)
{
control.MouseLeave += new EventHandler(control_MouseLeave);
control.ControlAdded += new ControlEventHandler(control_ControlAdded);
control.ControlRemoved += new ControlEventHandler(control_ControlRemoved);
foreach (Control innerControl in control.Controls)
{
SubscribeEvents(innerControl);
}
}
private void UnsubscribeEvents(Control control)
{
control.MouseLeave -= new EventHandler(control_MouseLeave);
control.ControlAdded -= new ControlEventHandler(control_ControlAdded);
control.ControlRemoved -= new ControlEventHandler(control_ControlRemoved);
foreach (Control innerControl in control.Controls)
{
UnsubscribeEvents(innerControl);
}
}
private void control_ControlAdded(object sender, ControlEventArgs e)
{
SubscribeEvents(e.Control);
}
private void control_ControlRemoved(object sender, ControlEventArgs e)
{
UnsubscribeEvents(e.Control);
}
protected override void OnMouseLeave(EventArgs e)
{
CheckMouseLeave();
base.OnMouseLeave(e);
}
private void control_MouseLeave(object sender, EventArgs e)
{
CheckMouseLeave();
}
private void CheckMouseLeave()
{
Point pt = PointToClient(Cursor.Position);
if (ClientRectangle.Contains(pt) == false)
{
OnMouseLeftFrom();
}
}
private void OnMouseLeftFrom()
{
Console.WriteLine("Mouse left the form");
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With