Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как перехватить нажатие клавиш в диалоге?  (Прочитано 9631 раз)
0 Пользователей и 1 Гость смотрят эту тему.
jur
Помогающий

lt
Offline Offline

« : 21-05-2009 18:19 » 

Привет!

Прошу прощения, наверное, избитая тема, но никак не "разгрызается". Поиск в ответ дал единственную тему про .NET, который для меня пока еще слишком сложен.

Работа идет в чистом Win API, никаких MFC или Дотнетов. В своей DLL'ке я делаю вызов диалога "About":

DialogBox(UtilsR2_hModule, MAKEINTRESOURCE(IDD_DIALOG_Main), *pMainProgInterf->phMainWindow, (DLGPROC)About_Main_proc);

Этот диалог показывает версию программы, перечисляет подключенные модули, другую вспомогательную информацию, - в общем, обычная рутина. Мне хотелось бы при нажатии клавиши 'H' вызвать другой диалог с описанием "железа" (ну там версии прошивок и т.п.). Для этого в диалоге "About" я ловлю WM_NOTIFY. Определил, что клавиши опознаются по LVN_KEYDOWN (у меня в "About" несколько статичных строк и список присоединенных модулей в виде листбокса).

Но когда я точно так же поступаю во втором диалоге, вызванном из первого, (в том, который про описание "железа") - никаких WM_NOTIFY я вообще не вижу! Т.е. в первом диалоге (пока не вызван второй диалог) я еще вижу что-то типа:

[40.18839] WM_NOTIFY: Control = 1001, hwndFrom = 00020A24, idFrom = 1001, code = -155
[40.18858] LVN_KEYDOWN

А во втором - вообще тишина...

Хотел спросить: как же все-таки добраться до цикла сообщений диалогового окна? Моя процедура диалога получает только какие-то остаточные сообщения. Я пробовал применить SetWindowLong на окне диалога - получил в точности те же сообщения, что и диалоговая процедура (что для меня совершенно непонятно: ведь процедура окна должна получить все, что этому окну посылается!).

Что делать, друзья?! Как мне добраться до очереди сообщений диалога, чтобы узнать, что пользователь нажал злосчастную клавишу 'ESC'? Улыбаюсь Идеалом было бы получение аналога PreTranslateMessage из MFC.

Спасибо!

P.S. Да, забыл сказать, я пробовал в качестве родительского окна (который *pMainProgInterf->phMainWindow) использовать NULL. Эффект тот же самый. Т.е. нулевой...
« Последнее редактирование: 21-05-2009 18:22 от jur » Записан

MPEG-4 - в массы!
jur
Помогающий

lt
Offline Offline

« Ответ #1 : 22-05-2009 18:48 » 

Произвел некоторые исследования. Если на диалог поставить TAB-control, то можно ловить TCN_KEYDOWN. Это позволит мне закрыть свою текущую задачу, но хотелось бы, все-таки, добраться до WM_KEYDOWN. Получается, что следует использовать для окна диалога свой класс, правильно?
Записан

MPEG-4 - в массы!
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 23-05-2009 07:01 » 

jur, свой класс - это самое простое  ) Почему бы и нет ?
Записан

jur
Помогающий

lt
Offline Offline

« Ответ #3 : 23-05-2009 13:56 » 

Спасибо, Алексей1153++, за слова ободрения! Я очень рад, что мыслю в верном направлении :-) Я, правда, так еще не делал, но опыт - дело наживное ;-)

Спасибо!
Записан

MPEG-4 - в массы!
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 23-05-2009 13:58 » 

jur, не за что Улыбаюсь Завсегда рад
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines