2010-03-29 9 views
6

Próbuję rozszerzyć kontrolę TextBox, aby dodać funkcję znakowania wodnego. Przykładem znalezionym w CodeProject jest użycie zaimportowanej funkcji SendMessage.SendMessage 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"); 
} 

Zastanawiam się dlaczego nie korzystać chroniony WndProc zamiast

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

Oba wydają się działać dobrze. Prawie wszystkie przykłady, które widziałem w Internecie, korzystają z funkcji SendMessage. Dlaczego? Czy funkcja WndProc nie zastępuje SendMessage?

P.S. Nie wiem, czy mogę przekonwertować string na IntPtr i ustaliłem, że Marshal.StringToHGlobalUni działa poprawnie. Czy to jest właściwa funkcja, aby to zrobić?

Odpowiedz

11

WndProc nie zastępuje SendMessage, jest równoważnikiem .NET z WindowProc. WndProc jest wywoływane przez pompę komunikatów aplikacji (która odbiera wiadomości wysłane lub wysłane przez SendMessage lub PostMessage) w celu ich przetworzenia. Dzwoniąc bezpośrednio pod numer WndProc, omijasz specjalną obsługę komunikatów, którą wykonuje Windows, na przykład pakowanie wiadomości WM_PAINT i potencjalnie może powodować nieprzyjemne problemy, gdy wiadomości pojawiają się w kolejności, w jakiej są oczekiwane przez okna w aplikacji.

Jak stwierdzono w MSDN,

Wszystkie komunikaty są wysyłane do WndProc metody po dostaniu się sączy przez zastosowano metodę PreProcessMessage.

Metoda WndProc odpowiada dokładnie funkcji Windows WindowProc. Aby uzyskać więcej informacji dotyczących przetwarzania wiadomości systemu Windows, zobacz dokumentację funkcji WindowProc w bibliotece MSDN pod adresem http://msdn.microsoft.com/library.

Dzwoniąc bezpośrednio, pozbawiasz system szansy na wykonanie wstępnego przetwarzania lub jakąkolwiek inną obsługę tego komunikatu. Platforma .NET działa na systemie Windows i bez wysyłania lub wysyłania wiadomości system podstawowy nie może nic z tym komunikatem, więc tracisz wszystko, co system bazowy może zrobić dla ciebie.

Powiązane problemy