2015-05-21 3 views
10

क्यों ओवरराइड करेंगे, मैं चारों ओर देख रहा हूं और वास्तव में कोई जानकारी नहीं देखी है कि कोई संदेश संदेशों को संभालने के लिए wndproc को ओवरराइड क्यों करेगा।आप wndproc

तो मैं सोच:

यह क्यों करते हैं?

इसे कब करना है?

सी # में इसका सामान्य उद्देश्य क्या है?

मैंने सीरियल COM प्लग और कंप्यूटर से अनप्लग किए जाने पर इसका उपयोग करने का प्रयास किया है, लेकिन मुझे लगा जैसे मैंने स्वयं को बनाए गए तरीकों पर बेहतर निर्भरता प्रबंधित की है।

मेरे द्वारा देखे जाने वाले अन्य संदेश कुंजी-प्रेस, कर्सर सेटिंग्स और अन्य विभिन्न कार्यों के लिए हैं। ऐसा कहा जा रहा है कि इनमें से अधिकतर चीजें पहले ही सी # पुस्तकालयों में विधियों में बनाई गई हैं। तो फिर मैं अपने तीन मुख्य प्रश्नों पर वापस आ गया हूं। कोई भी जानकारी, राय, उदाहरण, आदि भयानक होगा।

+0

इस प्रश्न को मेटा पर संदर्भित किया गया था: https://meta.stackoverflow.com/a/295041/3614835 –

उत्तर

12

WndProc() विंडोज विंडो के काम के तरीके के लिए बहुत ही महत्वपूर्ण है। यह विंडो प्रक्रिया के आस-पास एक प्रबंधित रैपर विधि है, जो एक पुराने कार्यकाल में सी में लिखा जाने वाला एक फ़ंक्शन है। यह एक तरीका है कि आप खिड़की के व्यवहार को कस्टमाइज़ करते हैं, जिससे ऑपरेटिंग सिस्टम या अन्य प्रोग्राम्स द्वारा उत्पन्न अधिसूचनाओं को अलग-अलग प्रतिक्रिया मिलती है।

आपको सामान्य रूप से इसे ओवरराइड करने की आवश्यकता नहीं है, बेस क्लास में WndProc() विधि अधिकांश मूलभूत सूचनाओं को संभालती है। उन्हें अनुकूल आदि जैसे .NET ईवेंट में बदलना, लेकिन यह पूर्ण नहीं है, या तो क्योंकि अधिसूचना बहुत अस्पष्ट या जरूरी है क्योंकि यह कस्टम विंडो द्वारा उपयोग किए गए संदेशों के बारे में कुछ भी नहीं जान सकती है। इस मामले में आप संदेश को अवरुद्ध करने के लिए WndProc() को ओवरराइड करने पर वापस आ सकते हैं। सबसे अच्छा उदाहरण मैं सोच सकता हूं कि एक कस्टम विंडो फ्रेम खींचने के लिए एक सीमाहीन खिड़की बना रहा है और अभी भी खिड़की के सामान्य व्यवहार को दे रहा है। WM_NCHITTEST जैसे संदेशों को अवरुद्ध करके आसानी से किया जाता है, .NET द्वारा लिपटे नहीं।

वास्तव में grokking WndProc() को पेटज़ोल्ड की मौलिक पुस्तक "प्रोग्रामिंग विंडोज" पढ़ने की आवश्यकता है। शायद आज समझना इतना आसान नहीं है, यह सी भाषा की बुनियादी समझ मानता है। 30 साल पहले Winapi द्वारा लक्षित भाषा कौन सा था, ऑब्जेक्ट उन्मुख भाषाओं का व्यापक रूप से उपयोग नहीं किया गया था या फिर वापस उपलब्ध नहीं था। यह भी अन्यथा बताता है कि WndProc() के अंदर लेखन कोड काफी दर्दनाक क्यों है, बहुत कम अमूर्तता है और आप वास्तव में पॉइंटर्स को अनदेखा नहीं कर सकते हैं।

माइक्रोसॉफ्ट ने इसे विंडोज 8 और विनरेट एपीआई से शुरू करने के लिए इसे सेवानिवृत्त करने का प्रयास किया था। बिल्कुल एक स्लैमडंक सफलता नहीं, शायद विंडोज 10 इसे कुछ कर्षण देगा। संस्थापक तकनीक जो WinRT को हुड के तहत काम करती है वह COM है, सी से एक बड़ा कदम है क्योंकि यह ऑब्जेक्ट मॉडल का समर्थन कर सकता है। हालांकि यह दोस्ताना भाषा अनुमानों में अच्छी तरह से छिपा हुआ है, COM प्रोग्रामिंग कुछ प्रोग्रामर कुछ से बचने की कोशिश करेंगे :)

0

मुझे पता चला है कि यह UserControl के लिए कीप्रेस घटनाओं को संसाधित करने के लिए उपयोगी है।

कुंजीपटल, कीडाउन, या कीप घटनाएं UserControl से प्रतिक्रिया देने में काफी जटिल हैं (यहां तक ​​कि KeyPreview सेट को सत्य और सभी के साथ भी)। मैंने पाया कि अगर मैं WndProc() को ओवरराइड करता हूं तो मुझे कमांड को नियंत्रित करने की नियंत्रण की अधिक विश्वसनीयता होती है।