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ć?