Я пытаюсь расшириться 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
работы хорошо. Это - правильная функция, чтобы сделать это?
WndProc
не заменяет SendMessage
, это является эквивалентом WindowProc
в .NET. WndProc
вызывается насосом сообщений вашего приложения (который принимает сообщения, отправленные или отправленные с помощью SendMessage
или PostMessage
) для их обработки. Вызывая WndProc
напрямую, вы обойдете специальную обработку сообщений, которую выполняет Windows, такую как объединение сообщений WM_PAINT
, и потенциально может вызвать некоторые неприятные проблемы, когда сообщения появляются не в том порядке, в котором их ожидают окна в вашем приложении.
Как указано в MSDN ,
Все сообщения отправляются в метод WndProc после фильтрации с помощью метода PreProcessMessage.
Метод WndProc точно соответствует функции Windows WindowProc. Для получения дополнительной информации об обработке сообщений Windows см. Документацию по функции WindowProc в MSDN. Библиотека по адресу http://msdn.microsoft.com/library .
Вызывая его напрямую, вы лишаете систему возможности выполнить предварительную обработку или любую другую обработку этого сообщения. Платформа .NET работает поверх Windows, и без отправки или публикации сообщения базовая система ничего не может сделать с этим сообщением, поэтому вы теряете все, что базовая система может сделать для вас.