Я пытаюсь расширить TextBox
элемент управления, чтобы добавить функцию водяных знаков. Пример, который я нашел в CodeProject, использует импортированную функцию SendMessage.
[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");
}
Мне интересно, почему бы не использовать защищенный WndProc вместо
void SetWatermark()
{
var m =new Message() { HWnd = this.Handle, Msg = 0x1501, WParam = (IntPtr)0, LParam = Marshal.StringToHGlobalUni("Sample") };
WndProc(ref m);
}
Кажется, что оба работают нормально. Почти все примеры, которые я видел в интернете, используют функцию SendMessage
. Это почему? Разве функция WndProc
не предназначена для замены SendMessage
?
P.S. Я не знаю, правильно ли конвертировать string
в IntPtr
и обнаружил, что Marshal.StringToHGlobalUni
работает нормально. Это правильная функция, чтобы сделать это?