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コードを実行しようとしている1秒後にチェックした後でもtrueが返されますが、時々彼はそれを瞬時に取得します。
これに関する 2 番目の問題は、メソッドのthis.Close();
行でスレッド例外が発生することです。checkPost()
クロススレッド操作が無効です: コントロール 'MyForm' は、それが作成されたスレッド以外のスレッドからアクセスされました。
今、マウスを離す部分を別の方法で実装する方法がよくわかりません。