Дочернему окну не приходит WM_KEYDOWN
Создаю контрол STATIC, меняю обработчик на свой, обрабатываю событие WM_KEYDOWN но когда паклацать клаву - оказываеться WM_KEYDOWN моему контролу не приходит вообще, хотя все остальные события приходят. Таже трабла и при создании собственного дочернего окна.
Сообщение приходит только в окно имеющее фокус ввода. Если память не изменяет начиная с 2000 ка, фокус ввода и активность окна разделены, те это могут быть разные окна...
Да уж... Пробовал ставить фокус вручную (SetFocus) - помогает но фокус частенько сам как-то возвращаеться основному окну, и облом... Можно конечно и в главном окне отлавливать клаву, но етот вариант мне не подходит. Сейчас проблема решаеться установкой хука на клаву в своем приложении. Но все таки...
Функция IsDialogMessage при обработке сообщения определяет, клавиатурное ли оно и организовывает спецобработку. Если, например, пришел TAB, то IsDialogMessage посылает дочерним контролам диалога WM_GETDLGCODE и, в зависимости от их ответа, перемещает фокус клавиатурного ввода. Обработчик static'а возвращает DLGC_STATIC, поэтому фокус его "проскакивает". Надо возвращать что-то более осмысленное. Рекомендую поэкспериментировать.
Ну или обрабатывай WM_KEYDOWN в очереди сообщений приложения
Здесь диалог не рассматривается.
Phodopus
Цитата: 12345678
Можно конечно и в главном окне отлавливать клаву, но етот вариант мне не подходит.
Цитата:
Ну или обрабатывай WM_KEYDOWN в очереди сообщений приложения
Цитата:
Можно конечно и в главном окне отлавливать клаву, но етот вариант мне не подходит.
ну во-первых я предлагал в очереди приложения, а не окна,
во-вторых думаешь ставить хук на клаву лучше чем обрабатывать сообщения окна/приложения??? совсем нет!
Направлять все сообщения о нажатиях клавиш в очередь сообщений текстовой метки - глюк полнейший. Меняй концепт.