2010-03-29 11 views
6

Filigran işlevlerini eklemek için TextBox denetimini genişletmeye çalışıyorum. CodeProject üzerinde bulduğum örnek, içe aktarılan SendMessage işlevini kullanıyor. WndProc korumalı kullanmayın neden merak ediyorumSendMessage vs. 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"); 
} 

yerine

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

İkisi yarıyor gözüküyor. İnternette gördüğüm neredeyse tüm örnekler SendMessage işlevini kullanıyor. Neden? SendMessage'u değiştirmek için tasarlanmış WndProc işlevi değil mi?

P.S. string'u IntPtr'a dönüştürmeyi doğru bilmiyorum ve Marshal.StringToHGlobalUni'un işe yaramadığını öğrendim. Bunu yapmak doğru işlev midir?

cevap

11

WndProcSendMessage değiştirmez, WindowProc .NET eşdeğeridir. Uygulamanızın (SendMessage veya PostMessage tarafından gönderilen veya gönderilen iletileri alan), iletinizin işlenmesi için WndProc çağrılır. Doğrudan WndProc numaralı telefonu arayarak, Windows'un gerçekleştirdiği özel ileti işleyişini (örneğin, WM_PAINT iletileri) by-pass ederek iletileriniz, uygulama içinde pencereler tarafından beklendiği sırada iletilerin dışında görünecek bazı sorunlara yol açabilir.

MSDN belirtildiği üzere

,

Tüm mesajlar PreProcessMessage yöntemi ile filtre elde sonra WndProc yöntemine gönderilir.

WndProc yöntemi, Windows WindowProc işlevine tam olarak karşılık gelir. Windows iletileriyle ilgili daha fazla bilgi için, MSDN kitaplığındaki WindowProc işlev belgelerine bakın http://msdn.microsoft.com/library. doğrudan arayarak

, sen preprocessing veya bu mesajın herhangi bir başka işleme gerçekleştirmek için bir şans sistemi mahrum. .NET çerçevesi, Windows'un tepesinde çalışır ve iletiyi göndermeden veya göndermeden, temel sistem bu iletiyle hiçbir şey yapamaz, bu nedenle altta yatan sistemin sizin için yapabileceği herhangi bir şeyi kaybedersiniz.

İlgili konular