SendMessage vs. WndProc
Ich bin versucht zu verlängern TextBox
- Steuerelement hinzufügen, Wasserzeichen-Funktionalität. Das Beispiel, das ich gefunden habe auf CodeProject ist unter Verwendung der importierten der SendMessage-Funktion.
[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");
}
Frage ich mich, warum nicht geschützt WndProc statt
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 gesehen habe, auf internet-Nutzung SendMessage
Funktion. Warum ist das so? Nicht WndProc
Funktion entwickelt, um zu ersetzen SendMessage
?
P. S. ich weiß nicht Recht, zu konvertieren string
zu IntPtr
und festgestellt, dass Marshal.StringToHGlobalUni
funktioniert ok. Ist es richtig Funktion, dies zu tun?
Du musst angemeldet sein, um einen Kommentar abzugeben.
WndProc
nicht ersetzenSendMessage
ist es das .NET-äquivalentWindowProc
.WndProc
ist von Ihrer Anwendung aufgerufen, die Botschaft Pumpe (die empfängt Nachrichten, die gesendet oder gepostet vonSendMessage
oderPostMessage
) zu verarbeiten. Durch den AufrufWndProc
Sie direkt durch-pass die spezielle Nachricht, die Handhabung, die Windows ausführt, wie die BündelungWM_PAINT
Nachrichten, und kann potenziell dazu führen, einige böse Probleme, bei denen Meldungen erscheinen, aus der Reihenfolge, die Sie erwarten von Fenstern in Ihrer Anwendung.Wie gesagt in MSDN,
Durch aufrufen es direkt, Sie entziehen dem system eine chance zu erfüllen Vorverarbeitung oder irgendwelche andere Handhabung der Nachricht ist. Die .NET framework läuft auf Basis von Windows und ohne das senden oder die Nachricht, das zugrunde liegende system kann nichts mit dieser Nachricht, so verlieren Sie sich auf alles, was das zugrunde liegende system könnte für Sie tun.