воскресенье, 17 октября 2010 г.

Нет, правда, вы должны передавать все необработанные сообщения в DefWindowProc

Это перевод No, really, you need to pass all unhandled messages to DefWindowProc. Автор: Реймонд Чен.

Ранее я обсудил, как нам пришлось возвращать специальное значение BROADCAST_QUERY_DENY, если вы хотели заблокировать запрос удаления устройства, потому что слишком много программ думало, что они покрыли своим кодом все возможные сообщения Windows и поэтому они просто всегда возвращали ноль. С тех пор в систему добавили много новых сообщений, многие из которых имеют нетривиальную обработку в DefWindowProc. Хотя, время от времени, я встречаюсь с очередной программой, которая считает, что "Microsoft никогда не расширит оконный менеджер" - и просто возвращает 0 для всех сообщений, которые она не обрабатывает.

В самом деле, часто эти программы даже не покрывают всех современных сообщений, не говоря уже о будущих! Одна программа имела вспомогательное окно, которое обрабатывало только несколько служебных сообщений и возвращала 0 для остальных. В результате вы не могли завершить работу системы, потому что 0 в сообщении WM_QUERYENDSESSION означает "Нет, не выключайся". Я думаю, что люди, которые написали эту программу, считали, что вы должны закрывать её сами перед выключением компьютера (предполагается, что программы не должны блокировать выключение, если только это решение не пришло от пользователя - обычно нажатием на кнопку "Отмена" в диалоге "Вы хотите выйти без сохранения?"). Если в фокусе было их вспомогательное окно, то не работали и расширенные кнопки управления клавиатурой (типа изменения громкости), потому что окно не передавало сообщение WM_APPCOMMAND в функцию DefWindowProc.

Поэтому, ещё раз, я умоляю вас: если вы не обрабатываете сообщение в вашей оконной процедуре - передавайте его в функцию DefWindowProc. Ваши клиенты скажут вам спасибо.

(Примечание для людей, который понимают буквально всё, что я говорю: если вы используете какой-либо framework, то следуйте правилам этого framework-а для указания, что вы хотите обработку по-умолчанию. Например, диалоговые процедуры не передают необработанные сообщения в функцию DefWindowProc. Они просто возвращают False для указания необходимости обработки сообщения по-умолчанию).

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

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

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

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

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

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

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