2011-02-15 11 views
8

मुझे पता है कि मानक फ़ाइल के संदर्भ मेनू को विस्तारित करना संभव है, हालांकि सिस्टम-व्यापी टेक्स्ट बॉक्स संदर्भ मेनू में आइटम जोड़ने का कोई तरीका है?सभी टेक्स्ट बॉक्स ऑपरेटिंग सिस्टम के लिए संदर्भ मेनू आइटम जोड़ें

ऐसा होगा कि प्रत्येक टेक्स्ट बॉक्स में नया आइटम दिखाई देगा जो उपयोगकर्ता विंडोज़ में कहीं भी टाइप कर सकता है?

उदाहरण के लिए एक वर्तनी परीक्षक के खिलाफ चयनित पाठ को देखने के लिए ऐसी सुविधाओं को जोड़ने की अनुमति देने के लिए।

+1

"ऑपरेटिंग सिस्टम" के रूप में व्यापक रूप से सिस्टम-व्यापी? –

+0

यूप! यह सही है – John

+2

ऐसा लगता है कि आप कुछ बेहद परेशान करने वाले हैं। –

उत्तर

2

टेक्स्ट बॉक्स से प्रवेश करें जिसे आप उपयोग करने का प्रयास कर रहे हैं और वहां डिफ़ॉल्ट मान जोड़ें। टेक्स्ट बॉक्स क्लास के बजाय अपनी कक्षा का प्रयोग करें।

+0

यह केवल वर्तमान एप्लिकेशन को प्रभावित करेगा – John

0

फॉर्म और संदर्भ मेनू के साथ बाइंड विधि को कॉल करें।

  c.ControlAdded += (s, e) => Bind(e.Control, menu); 

यह कहा जाता है से आबद्ध विधि का कारण बनता है, जब भी एक नियंत्रण या किसी अन्य रूप में जोड़ा जाता है:

void Bind(Control c, ContextMenu menu) 
    { 
    foreach (Control subcontrol in c.Controls) 
     Bind(subcontrol); 

    TextBox textBox = c as TextBox; 
    if (textBox != null) 
    { 
     textBox.ContextMenu = menu; 
    } 
    } 

आप एक गतिशील पाठ बॉक्स जोड़ने, तो बाध्य विधि की शुरुआत में इस जगह नियंत्रण।

1

आप add a Mouse Hook

करने के लिए है और फिर एक संदर्भ मेनू पॉप अप जब खिड़की/नियंत्रण आप क्लिक कर रहे हैं एक पाठ बॉक्स है जाएगा।

यह संभवतः वर्तमान संदर्भ मेनू में हस्तक्षेप कर सकता है (और शायद होगा) क्योंकि आप उन्हें छुपाएंगे या उनके साथ संघर्ष करेंगे।

(ए भयानक योजना हालांकि ...)

3

इस के साथ सी # तकनीकी रूप से असंभव है। आइए अगली स्थिति की कल्पना करें। मान लीजिए कि आपने अपने प्रबंधित विस्तार को सफलतापूर्वक लिखा है और यह सिस्टम में किसी भी टेक्स्टबॉक्स संदर्भ मेनू को "विस्तारित करता है"। और निश्चित रूप से आपको जो भी नया मेनू आइटम जोड़ा गया है उसे संभालना चाहिए। और इसे प्राप्त करने के लिए आपको प्रत्येक प्रबंधित प्रक्रिया में अपने प्रबंधित कोड को इंजेक्ट करना चाहिए जिसमें टेक्स्टबॉक्स है और इसकी WindProc को प्रतिस्थापित करें। ठीक है, मान लें कि सिस्टम में प्रबंधित ऐप है जिसे आपके संस्करण के लिए इस्तेमाल किए गए संस्करण से अलग .NET संस्करण के लिए लिखा गया था। तो इस मामले में आपको विस्तार इंजेक्शन के दौरान महत्वपूर्ण त्रुटि मिलेगी क्योंकि प्रति प्रक्रिया केवल .NET को लोड किया जा सकता है। तो मजबूत प्रबंधित निम्न स्तर हुक या खोल विस्तार लिखने का कोई तरीका नहीं है। here से:

वैश्विक हुक के अलावा .नेट फ्रेमवर्क
में समर्थित नहीं हैं WH_KEYBOARD_LL निम्न स्तर के हुक और WH_MOUSE_LL निम्न स्तर के हुक, आप में वैश्विक हुक को लागू नहीं कर सकते हैं माइक्रोसॉफ्ट .NET Framework। वैश्विक हुक स्थापित करने के लिए, एक हुक में मूल DLL निर्यात को अन्य प्रक्रिया में इंजेक्ट करने के लिए होना चाहिए जिसके लिए एक वैध, कॉल करने के लिए लगातार फ़ंक्शन की आवश्यकता होती है। यह व्यवहार के लिए एक डीएलएल निर्यात की आवश्यकता है। .NET Framework DLL निर्यात का समर्थन नहीं करता है। प्रबंधित कोड में फ़ंक्शन पॉइंटर के लिए एक सतत मान का कोई अवधारणा नहीं है क्योंकि इन फ़ंक्शन पॉइंटर्स प्रॉक्सी हैं जो गतिशील रूप से बनाए गए हैं।

कम-स्तरीय हुक प्रक्रियाओं को हुक स्थापित करने वाले थ्रेड पर कहा जाता है। निम्न-स्तरीय हुक की आवश्यकता नहीं है हुक प्रक्रिया DLL में लागू की जानी चाहिए।

आप this आलेख भी देख सकते हैं और पता लगा सकते हैं कि आपको प्रबंधित शैल एक्सटेंशन क्यों नहीं लिखना चाहिए।

+0

बहुत रोचक धन्यवाद – John