Приветствую всех.
Конкретное решение было указано прямым текстом: используйте сабклассинг.
Вы должны отчётливо себе представлять, в каком из окон происходит обработка сообщения.
Каждый элемент управления -- это окно. У _каждого_ окна есть своя оконная процедура.
Сообщение WM_KEYDOWN поступает в окно, которое непосредственно содержит фокус.
Это все написано в документации (и даже по-русски)!
А теперь напишите своими словами, что происходит, когда в вашем приложении фокус
находится, например, на кнопке и вы нажимаете клавишу пробел?
Какое окно получит сообщение WM_KEYDOWN???
Если есть трудности с пониманием работы оконного интерфейса Windows, то в вашем
распоряжении, во-первых, утилита spyxx.exe (должна присутствовать, по крайней
мере, в профессиональном выпуске VisualStudio), которая позволяет перехватывать
любые сообщения любых окон; во-вторых, если работа с spyxx.exe тоже вызывает
затруднение, то у вас есть швейцарский нож под названием "скрипты JAWS", при
помощи которых можно послать любое сообщение любому окну. В качестве эксперимента
напишите скрипт, который отправит WM_KEYDOWN (0x100) вашему диалоговому окну
напрямую и ваш код обработки WM_KEYDOWN сработает.
Надо ещё понимать концептуальные вещи: диалоговые окна и элементы управления
придуманы, кроме всего прочего, и для того, чтобы разработчик приложения не занимался
непосредственной обработкой клавиатурного ввода. Необходимость обработки нажатий
отдельных клавиш в диалоговом окне или обычном окне с элементами управления означает,
что вы неправильно спроектировали интерфейс пользователя. Либо ваше приложение
настолько оригинальное, что имеющиеся элементы управления ему не подходят, тогда
вы берёте "чистое" окно и полностью реализуете обработку клавиатурного ввода
(не используя никакие элементы управления). Так делают, например, в играх.
Либо вы используете стандартные элементы управления, меню, ускорители и т.п.,
тогда при правильном их использовании у вас не возникает необходимости опускаться
до обработки клавиатурного ввода (все делает система и элементы управления).
Исключением из последнего варианта является случай, когда стандартный элемент
управления вас (как разработчика приложения) почти устраивает, но некоторые изменения
в его поведение вам хотелось бы внести. Именно для этого и предназначен сабклассинг.
Успехов. Анатолий.