SendMessage против WndProc - PullRequest
       11

SendMessage против WndProc

6 голосов
/ 29 марта 2010

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

1 Ответ

11 голосов
/ 29 марта 2010

WndProc не заменяет SendMessage, это эквивалент в .NET WindowProc. WndProc вызывается насосом сообщений вашего приложения (который получает сообщения, отправленные или отправленные SendMessage или PostMessage) для их обработки. Вызывая WndProc напрямую, вы игнорируете специальную обработку сообщений, которую выполняет Windows, такую ​​как объединение WM_PAINT сообщений, и потенциально можете вызвать некоторые неприятные проблемы, когда сообщения появляются не в том порядке, в котором они ожидаются окнами в вашем применение.

Как указано в MSDN ,

Все сообщения отправляются в WndProc метод после фильтрации метод PreProcessMessage.

Метод WndProc точно соответствует в функцию Windows WindowProc. Для получения дополнительной информации об обработке Сообщения Windows, см. WindowProc функциональная документация в MSDN библиотека в http://msdn.microsoft.com/library.

Вызывая его напрямую, вы лишаете систему возможности выполнить предварительную обработку или любую другую обработку этого сообщения. .NET Framework работает поверх Windows, и без отправки или публикации сообщения базовая система не может ничего сделать с этим сообщением, поэтому вы теряете все, что может сделать для вас базовая система.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...