Я использую событие MouseLeave, чтобы проверить, покинул ли пользователь мою форму и закрыть мое окно, но использование this.MouseLeave += new System.EventHandler(this.InvisibleForm_Leave);
слишком медленно, только если я собираюсь медленно покидать свою форму, событие запускается, перемещая его обычным способом / немного быстрее Я не получаю отпуск.
Поэтому я попытался самостоятельно проверить, покинула ли моя форма указатель мыши или нет:
private void checkPos()
{
Rectangle rec = this.Bounds;
while (true)
{
Point point = new Point(Cursor.Position.X, Cursor.Position.Y);
if (!rec.Contains(point))
{
Console.WriteLine("leaving");
this.Close();
}
Thread.Sleep(100);
}
}
запустился в собственном потоке после создания формы:
public MyForm()
{
InitializeComponent();
Thread m_mouseListenerThread = new Thread(new ThreadStart(this.checkPos));
m_mouseListenerThread.Start();
}
Но с этим у меня более или менее та же проблема: выход из области по-прежнему возвращает истину после проверки с помощью rec.Contains(point)
, только через секунду он собирается выполнить код if, но иногда он получает это мгновенно.
Вторая проблема заключается в том, что я получаю исключение потока в строке this.Close();
в методе checkPost()
:
Межпоточная операция недействительна: элемент управления MyForm доступен из потока, отличного от потока, в котором он был создан.
Сейчас я толком не знаю, как по-другому реализовать выходящую часть мыши.
Thread.Sleep(500);
не ловит вашу мышь в этот период времени. - person Sandeep Bansal   schedule 20.04.2012