我需要一種檢測光標何時進入或離開窗體的方法。當控件填充表單時,Form.MouseEnter/MouseLeave不起作用,因此我還必須訂閱控件的MouseEnter事件(例如表單上的面板)。任何其他跟蹤形式光標進入/退出全球?WinForms:光標進入/離開窗體或其控件時檢測
2
A
回答
1
你可以用win32的做到像這樣的回答: How to detect if the mouse is inside the whole form and child controls in C#?
或者你可以只鉤出來頂層控件形式的OnLoad:
foreach (Control control in this.Controls)
control.MouseEnter += new EventHandler(form_MouseEnter);
+1
關於你的第二種選擇:你還必須擔心有兒童控制的兒童控制(他們也有兒童控制,他們也有......)。我不會推薦實施。 – ean5533 2012-03-08 14:26:28
4
你可以試試這個:
private void Form3_Load(object sender, EventArgs e)
{
MouseDetector m = new MouseDetector();
m.MouseMove += new MouseDetector.MouseMoveDLG(m_MouseMove);
}
void m_MouseMove(object sender, Point p)
{
Point pt = this.PointToClient(p);
this.Text = (this.ClientSize.Width >= pt.X &&
this.ClientSize.Height >= pt.Y &&
pt.X > 0 && pt.Y > 0)?"In":"Out";
}
的MouseDetector類:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Drawing;
class MouseDetector
{
#region APIs
[DllImport("gdi32")]
public static extern uint GetPixel(IntPtr hDC, int XPos, int YPos);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern bool GetCursorPos(out POINT pt);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr GetWindowDC(IntPtr hWnd);
#endregion
Timer tm = new Timer() {Interval = 10};
public delegate void MouseMoveDLG(object sender, Point p);
public event MouseMoveDLG MouseMove;
public MouseDetector()
{
tm.Tick += new EventHandler(tm_Tick); tm.Start();
}
void tm_Tick(object sender, EventArgs e)
{
POINT p;
GetCursorPos(out p);
if (MouseMove != null) MouseMove(this, new Point(p.X,p.Y));
}
[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
public int X;
public int Y;
public POINT(int x, int y)
{
X = x;
Y = y;
}
}
}
相關問題
- 1. 鼠標離開控件時Winforms事件
- 2. 如何檢測鼠標何時離開窗體?
- 3. 檢測鼠標離開pygtk窗口
- 4. C#:檢測鼠標事件(進入,離開,向下等)
- 5. 如何可靠地檢測鼠標何時離開控件?
- 6. 如何檢測光標何時離開寫入文本框使用WPF C#
- 7. 當光標離開窗口時的Javascript事件
- 8. 光標離開窗口後光標位置停止工作
- 9. Mousenter取消鼠標離開上光標重新進入
- 10. 如何檢測進入和離開窗口的HTML5拖動事件,例如Gmail?
- 11. JavaFX,離開並進入Tab控件
- 12. 檢測用戶何時離開或進入帶有hubot的頻道
- 13. DataGrid - 鼠標進入+離開行事件
- 14. 如何將其他窗體的所有控件添加到Winforms中的窗體?
- 15. WinForms:如何在鼠標進入控件時使MouseEnter觸發?
- 16. 每當鼠標離開銀光燈時,關閉子窗口
- 17. 如何在選項卡控件winforms devexpress中打開新窗體?
- 18. WinForms檢索沒有窗體/用戶控件的鍵盤狀態
- 19. 的WinForms,.NET 3.5,在用戶控件或窗體
- 20. WinForms中的父窗體和子窗體用戶控件通信
- 21. 離開窗口或進入新標籤時暫停動畫,重新進入後繼續動畫?
- 22. 檢測鼠標離開窗口與處理
- 23. jQuery:光標檢測
- 24. 檢測IBeam光標
- 25. iphone sdk - 檢測用戶或光輸入
- 26. 鼠標進入和鼠標離開asp.net
- 27. 動態創建控件或在側面窗體中創建控件? C#winforms
- 28. 每次查看窗體時,WinForms控件都會出現錯位
- 29. 檢測用戶是否進入或離開地區 - 地理編碼
- 30. Winforms:調整窗體控件中的用戶控件的大小
你會發現你的[答案](http://stackoverflow.com/questions/986529/how-to-detect-if-the-mouse-is-inside-the-whole-form-and-child-controls -in-c) – David 2012-03-08 13:53:29
另一種方法是切換到WPF來解決路由事件的這個特定問題。 – 2012-03-08 13:58:04
簡單的200毫秒Timer,Mouse.Position和窗體的PointToClient()方法通常是一種有效的方法。 IMessageFilter也可以。 – 2012-03-08 14:29:02