пятница, 19 ноября 2010 г.

Даже если сообщение направлено не вам, вы всё равно должны пропустить его

Это перевод Even if the message is not for you, you still need to pass it on. Автор: Майкл Каплан.

Когда-то давно, в начальной школе мы занимались такой вещью как передача записочек. На записке было написано имя человека, которому она предназначалась; если записка была не вам, то вы должны были передать её дальше. Конечно же, вы не должны были её выкидывать или читать.

Хотя, эти уроки, которые мы выучили в раннем возрасте, не всегда вспоминаются сейчас, когда должны были бы...

Не так давно Реймонд Чен напомнил людям передавать все необработанные сообщения в DefWindowProc. И он полностью прав.

Я подумал, что можно указать на ещё один хороший пример - уведомление WM_INPUTLANGCHANGEREQUEST. Оно обрабатывается простым и детерминированным способом:
Возвращаемое значение
Это сообщение посылается (post), а не отправляется (send), приложению, так что возвращаемое значение игнорируется. Чтобы принять изменение, приложение должно передать сообщение в DefWindowProc. Чтобы отклонить изменение, приложение должно вернуть 0 без вызова DefWindowProc.

Примечания
Когда функция DefWindowProc принимает сообщение WM_INPUTLANGCHANGEREQUEST, она активирует новую локаль ввода и уведомляет приложение об этом изменении отправкой (send) сообщения WM_INPUTLANGCHANGE.

Индикатор языка присутствует на панели задач только если вы установили более одной клавиатурной раскладки и если вы вы включили этот индикатор в аплете панели задач.
Так что если ваше приложение не передаёт это сообщение в DefWindowProc, то пользователь не сможет изменить раскладку клавиатуры в вашем приложении!

Теперь нужно сказать, что этот процесс перестал был истиной в 100% случаев в Windows XP и выше; это так запланировано по дизайну, но, похоже, не указано ни в какой документации. Я объясню что сломало модель и почему (а также, как всё починить, чтобы работало!) завтра...

This post brought to you by "ܞ" (U+071e, a.k.a. SYRIAC LETTER YUHD HE)

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.