2009-02-25 29 views
11

Tôi cần tìm điều khiển bên dưới chuột, trong một sự kiện của một điều khiển khác. Tôi có thể bắt đầu với GetTopLevel và lặp lại bằng cách sử dụng GetChildAtPoint, nhưng có cách nào nhanh hơn không?Có cách nào nhanh chóng để điều khiển dưới chuột không?

+0

Tại sao bạn cần phải bắt đầu từ GetTopLevel, không thể bạn chỉ cần truy cập GetChildAtPoint trực tiếp? –

+0

(a) Điều khiển dưới con chuột không nhất thiết phải là con của điều khiển có sự kiện đang kích hoạt và (b) tôi vẫn sẽ phải lặp lại để tìm điều khiển bên trong nhất. – Simon

Trả lời

16

Mã này không làm cho rất nhiều ý nghĩa, nhưng nó tránh đi qua các bộ sưu tập Controls:

[System.Runtime.InteropServices.DllImport("user32.dll")] 
private static extern IntPtr WindowFromPoint(Point pnt); 

private void Form1_MouseMove(object sender, MouseEventArgs e) { 
    IntPtr hWnd = WindowFromPoint(Control.MousePosition); 
    if (hWnd != IntPtr.Zero) { 
    Control ctl = Control.FromHandle(hWnd); 
    if (ctl != null) label1.Text = ctl.Name; 
    } 
} 

private void button1_Click(object sender, EventArgs e) { 
    // Need to capture to see mouse move messages... 
    this.Capture = true; 
} 
+0

Làm cho cảm giác hoàn hảo với tôi. :-) WindowFromPoint grabs xử lý cửa sổ trực tiếp dưới vị trí chuột trên màn hình, bất kể ngăn chặn. Control.FromHandle dịch nó thành một điều khiển .Net (nếu có thể). Boom, xong rồi. Rất trơn. –

+0

Nó sẽ không dễ dàng hơn để mô phỏng cú click chuột? Bạn có thể tìm thấy liên kết [tại đây] (http://stackoverflow.com/questions/2416748/how-to-simulate-mouse-click-in-c) – Pimenta

+0

Nếu tôi muốn kiểm soát ứng dụng khác & –

2

chưa được kiểm tra và ra khỏi đỉnh đầu của tôi (và có thể chậm ...):

Control GetControlUnderMouse() { 
    foreach (Control c in this.Controls) { 
     if (c.Bounds.Contains(this.PointToClient(MousePosition))) { 
      return c; 
     } 
    } 
} 

Hoặc phải được ưa thích với LINQ:

return Controls.Where(c => c.Bounds.Contains(PointToClient(MousePosition))).FirstOrDefault(); 

Tôi không chắc chắn như thế nào đáng tin cậy này sẽ là, mặc dù.

+0

Tôi chỉ sử dụng điều này, thật tuyệt vời để có được * mọi điều khiển * dưới một vị trí chuột. Tuy nhiên, nó phải là c.Bounds.Contains (Điểm p) không c.Bounds.IntersectsWith (Rectangle r). – snicker

+0

D'oh! Cảm ơn. Tôi sẽ chỉ chỉnh sửa nó ngay bây giờ ... –

+0

điều này không làm việc với tôi .. Tôi luôn luôn có được kiểm soát hàng đầu – SolidSnake

Các vấn đề liên quan