SendMessage по сравнению с WndProc

Я пытаюсь расшириться 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 работы хорошо. Это - правильная функция, чтобы сделать это?

6
задан Poma 29 March 2010 в 17:24
поделиться

1 ответ

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, и без отправки или публикации сообщения базовая система ничего не может сделать с этим сообщением, поэтому вы теряете все, что базовая система может сделать для вас.

12
ответ дан 9 December 2019 в 20:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: