我有一個窗體上有很多控件。如何檢測鼠標何時離開表單?我已經嘗試爲每個控件和窗體連接一個MouseLeave事件,但這不起作用,因爲這些事件隨着鼠標移過控件一直觸發。有沒有一種方法可以實際運作?如何檢測鼠標何時離開窗體?
3
A
回答
5
你應該聽:
- 形式的所有控件的鼠標離開事件 形式的
- 鼠標離開事件
聽衆只是鏈接到,檢查光標是否在一個函數表單客戶端是否。
試試這個:
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");
}
2
通過觀察aygunes.myopenid.com的答案,我在做Vb.Net這個版本遞歸添加表格上MouseLeaveHandlers所有控件,然後使用nice Clientrectangle.Contains( pt)來檢查mousecursor是否在窗體上。像魅力一樣工作。 Cred轉到aygunes.myopenid.com。
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
AddMouseLeaveHandlers()
End Sub
Sub AddMouseLeaveHandlers()
For Each c As Control In Me.Controls
HookItUp(c)
Next
AddHandler Me.MouseLeave, AddressOf CheckMouseLeave
End Sub
Sub HookItUp(ByVal c As Control)
AddHandler c.MouseLeave, AddressOf CheckMouseLeave
If c.HasChildren Then
For Each f As Control In c.Controls
HookItUp(f)
Next
End If
End Sub
Private Sub CheckMouseLeave(ByVal sender As Object, ByVal e As System.EventArgs)
Dim pt As Point = PointToClient(Cursor.Position)
If ClientRectangle.Contains(pt) = False Then
MsgBox("Mouse left form")
End If
End Sub
4
我知道的唯一可靠的方法是計時器。下面是示例代碼的調整上翻車的不透明度:
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;
}
}
1
定時器將這個:
如果PointToClient(MousePosition).X < Me.Size.Width AndAlso PointToClient(MousePosition)。 X> -1 AndAlso PointToClient(MousePosition).Y < Me.Size.Height AndAlso PointToClient(MousePosition).Y> -1然後
「鼠標是在表單內
否則
「鼠標形式
結束如果
以外 - 由SNK
相關問題
- 1. 檢測鼠標離開pygtk窗口
- 2. 如何可靠地檢測鼠標何時離開控件?
- 3. WinForms:光標進入/離開窗體或其控件時檢測
- 4. 檢測鼠標離開窗口與處理
- 5. 當鼠標離開窗體時關閉應用程序
- 6. 當鼠標離開視口頂部時檢測到?
- 7. 如何在鼠標左鍵按下時檢測鼠標移動?
- 8. 如何停止檢測鼠標離開如果我沒有點擊元素
- 9. 如何在窗體窗體邊上更改鼠標光標
- 10. 檢測鼠標何時不移動
- 11. 如何通過移動到地址欄來檢測鼠標離開頁面?
- 12. Windows窗體上的鼠標離開事件
- 13. 如何防止鼠標懸停效果鼠標離開
- 14. 檢測鼠標是否離開瀏覽器窗口,並按下按鈕
- 15. 檢查鼠標是否離開窗口的特定部分
- 16. 如何檢測鼠標是否在整個窗體和子控件中?
- 17. 如何在標籤內點擊鼠標時移動窗體? C#
- 18. C#:檢測鼠標事件(進入,離開,向下等)
- 19. Flash可擴展橫幅 - 檢測鼠標離開
- 20. 如何檢測窗口刷新並離開事件
- 21. 如何檢測鼠標是否落在可可窗口之外?
- 22. 檢測窗口何時被打開
- 23. 檢測焦點何時離開元素的標準方法
- 24. 如何檢測鼠標點擊python 3.6.1
- 25. 如何檢測鼠標點擊QLineEdit
- 26. 如何檢測人造鼠標移動?
- 27. 如何檢測鼠標中鍵點擊?
- 28. gmail如何檢測鼠標移動?
- 29. 如何檢測鼠標點擊
- 30. 如何檢測鼠標滾輪傾斜?
是的,它可以工作,但在運行使應用程序inaccesible到那些身體disablilties的風險。 http://www.w3.org/TR/2008/WD-UNDERSTANDING-WCAG20-20081103/keyboard-operation-keyboard-operable.html – StingyJack 2008-11-11 20:18:47
您需要偵聽表單本身的mouseleave事件。 – korona 2008-11-10 22:55:47
Korona,您的方法不起作用,因爲如果鼠標通過控件覆蓋的空間離開窗體,form_mouseLeave不會觸發。 – AngryHacker 2008-11-10 23:00:53