2010-03-29 8 views
6

मैं वॉटरमार्किंग कार्यक्षमता जोड़ने के लिए TextBox नियंत्रण बढ़ाने की कोशिश कर रहा हूं। कोडप्रोजेक्ट पर जो उदाहरण मिला है वह आयातित SendMessage फ़ंक्शन का उपयोग कर रहा है।SendMessage बनाम WndProc

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] 
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam); 

void SetWatermark() 
{ 
    SendMessage(this.Handle, 0x1501, 0, "Sample"); 
} 

क्यों संरक्षित WndProc का उपयोग न मैं सोच रहा हूँ बजाय

void SetWatermark() 
{ 
    var m =new Message() { HWnd = this.Handle, Msg = 0x1501, WParam = (IntPtr)0, LParam = Marshal.StringToHGlobalUni("Sample") }; 
    WndProc(ref m); 
} 

दोनों ठीक से काम करने लगते हैं। इंटरनेट पर उपयोग किए गए लगभग सभी उदाहरण SendMessage फ़ंक्शन। ऐसा क्यों है? फ़ंक्शन SendMessage को प्रतिस्थापित करने के लिए डिज़ाइन नहीं किया गया है?

पीएस मुझे string को IntPtr में परिवर्तित करने का अधिकार नहीं है और पाया कि Marshal.StringToHGlobalUni ठीक काम करता है। क्या यह करने के लिए सही काम है?

उत्तर

11

WndProcSendMessage को प्रतिस्थापित नहीं करता है, यह WindowProc का .NET समतुल्य है। WndProc को आपके एप्लिकेशन के संदेश पंप द्वारा कॉल किया जाता है (जो उन्हें संदेश भेजने के लिए SendMessage या PostMessage द्वारा भेजे गए संदेशों को पोस्ट या पोस्ट किया जाता है)। WndProc को सीधे कॉल करके, आप WM_PAINT संदेशों को बंडल करने वाले विशेष संदेश हैंडलिंग को पास करके पास करते हैं, और संभावित रूप से कुछ ग़लत समस्याएं पैदा कर सकते हैं जहां संदेश आपके एप्लिकेशन के भीतर विंडोज़ द्वारा अपेक्षित ऑर्डर से दिखाई देते हैं।

रूप MSDN में कहा गया है,

सभी संदेश PreProcessMessage विधि के माध्यम से फ़िल्टर्ड हो रही के बाद WndProc विधि करने के लिए भेजा जाता है।

WNDProc विधि Windows WindowProc फ़ंक्शन में बिल्कुल से मेल खाता है। विंडोज संदेशों को संसाधित करने के बारे में अधिक जानकारी के लिए, MSPN लाइब्रेरी में http://msdn.microsoft.com/library पर लाइब्रेरी प्रोजेक्ट को विंडोप्रोक देखें।

इसे सीधे कॉल करके, आप उस संदेश के प्रीप्रोकैसिंग या किसी अन्य हैंडलिंग को करने का मौका सिस्टम को वंचित कर देते हैं। .NET फ्रेमवर्क विंडोज के शीर्ष पर चलता है और संदेश भेजने या पोस्ट किए बिना, अंतर्निहित सिस्टम उस संदेश के साथ कुछ भी नहीं कर सकता है, इसलिए आप अंतर्निहित सिस्टम के लिए कुछ भी कर सकते हैं।

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