2009-02-25 8 views
11

मुझे किसी अन्य नियंत्रण की स्थिति में माउस के नीचे नियंत्रण खोजने की आवश्यकता है। मैं GetTopLevel से शुरू कर सकता हूं और GetChildAtPoint का उपयोग करके फिर से शुरू कर सकता हूं, लेकिन क्या कोई तेज तरीका है?क्या माउस के नीचे नियंत्रण प्राप्त करने का कोई त्वरित तरीका है?

+0

तुम क्यों GetTopLevel पर शुरू करने की आवश्यकता है, तो आप बस सीधे GetChildAtPoint करने के लिए जाना नहीं कर सकता है? –

+0

(ए) माउस के नीचे नियंत्रण जरूरी नहीं है कि नियंत्रण का बच्चा जिसका आयोजन फायरिंग हो, और (बी) मुझे अभी भी आंतरिक नियंत्रण खोजने के लिए फिर से शुरू करना होगा। – Simon

उत्तर

16

इस कोड को समझ का एक बहुत नहीं है, लेकिन यह नियंत्रण संग्रह traversing से बचने करता है:

[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

मुझे सही समझ में आता है। :-) विंडोफ्रॉमपॉइंट रोकथाम के बावजूद, स्क्रीन पर मकान की स्थिति के नीचे सीधे विंडो हैंडल पकड़ लेता है। Control.FromHandle इसे नेट नियंत्रण में (यदि संभव हो) में अनुवाद करता है। बूम, किया। बहुत चालाक –

+0

माउस क्लिक को अनुकरण करना आसान नहीं होगा? आप एक लिंक [यहां] ढूंढ सकते हैं (http://stackoverflow.com/questions/2416748/how-to-simulate-mouse-click-in-c) – Pimenta

+0

क्या होगा यदि मैं किसी अन्य एप्लिकेशन का नियंत्रण प्राप्त करना चाहता हूं & –

2

untested है और मेरे सिर के ऊपर से (और शायद धीमी गति से ...):

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

या LINQ के साथ फैंसी होने के लिए:

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

मुझे यकीन है कि कैसे विश्वसनीय इस नहीं कर रहा हूँ हालांकि, होगा।

+0

मैंने अभी इसका इस्तेमाल किया है, माउस की स्थिति के नीचे * हर * नियंत्रण प्राप्त करना बहुत अच्छा है। हालांकि, यह सी। बाउंड होना चाहिए। (प्वाइंट पी) सी नहीं है। बाउंड्स। इंटरफेक्ट्स के साथ (आयताकार आर)। – snicker

+0

डी ओह! धन्यवाद। मैं इसे अभी संपादित करूँगा ... –

+0

यह मेरे साथ काम नहीं करता है .. मुझे हमेशा शीर्ष नियंत्रण मिलता है – SolidSnake

संबंधित मुद्दे

 संबंधित मुद्दे