2010-03-29 8 views
6

Ich versuche, TextBox Steuerelement zu erweitern, Wasserzeichenfunktion hinzuzufügen. Das Beispiel, das ich in CodeProject gefunden habe, verwendet die importierte SendMessage-Funktion.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"); 
} 

Ich frage mich, warum nicht WndProc stattdessen geschützt verwenden

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

Beide scheinen gut zu funktionieren. Fast alle Beispiele, die ich im Internet gesehen habe, verwenden SendMessage Funktion. Warum das? Ist nicht WndProc Funktion entwickelt, um zu ersetzen?

P.S. Ich weiß nicht, um string zu IntPtr zu konvertieren und festgestellt, dass Marshal.StringToHGlobalUni funktioniert ok. Ist es richtig, dies zu tun?

Antwort

11

WndProc ersetzt nicht , es ist das .NET-Äquivalent von WindowProc. WndProc wird von der Nachrichtenpumpe Ihrer Anwendung aufgerufen (die Nachrichten empfängt, die von SendMessage oder PostMessage gesendet oder gepostet werden), um sie zu verarbeiten. Wenn Sie WndProc direkt aufrufen, umgehen Sie die spezielle Nachrichtenverarbeitung, die Windows durchführt, z. B. das Bündeln von Nachrichten WM_PAINT, und können möglicherweise einige unangenehme Probleme verursachen, bei denen Nachrichten in der Reihenfolge angezeigt werden, wie sie von Windows in Ihrer Anwendung erwartet werden.

Wie in MSDN angegeben,

Alle Nachrichten werden an die durch die PreProcessMessage Verfahren nach dem Aufstehen gefiltert WndProc Methode gesendet.

Die WndProc-Methode entspricht exakt der Windows-WindowProc-Funktion. Weitere Informationen zur Verarbeitung von Windows-Meldungen finden Sie in der WindowProc -Funktionsdokumentation in der MSDN -Bibliothek unter http://msdn.microsoft.com/library.

Durch sie direkt anrufen, nehmen Sie das System eine Chance Vorverarbeitung oder eine andere Handhabung dieser Nachricht auszuführen. Das .NET-Framework läuft auf Windows und ohne die Nachricht zu senden oder zu posten, kann das zugrundeliegende System nichts mit dieser Nachricht tun, so dass Sie alles verlieren, was das zugrundeliegende System für Sie tun könnte.