2013-06-04 4 views
1

В настоящее время я разрабатываю DLL пользовательского интерфейса, который использует API WIN32. DLL должна работать на нескольких платформах, XP, WIN CE и т. Д. Мне удалось включить стыковку, привязку и т. Д., Но, похоже, проблема с кнопками владельца. Я могу нарисовать правильное состояние кнопки, фокус, щелчок, значение по умолчанию. Однако я не могу получить ключевые уведомления. Я специально хочу выполнить операцию щелчка на кнопке, которая в настоящее время имеет фокус, если пользователь нажимает кнопку ввода.Сообщения клавиатуры от дочерних элементов управления

Обратите внимание, что я использую цикл сообщений Windows, а не цикл сообщений диалога. Я использую крючки окон, чтобы подключиться к созданию окна, и установить пользовательские данные, чтобы «указать» на мой экземпляр управления. Если я тестирую WM_KEYDOWN в основном контуре сообщения, я могу получить дескриптор экземпляра элемента управления кнопкой и передать сообщение соответствующему элементу управления. К сожалению, я имею дело с большим количеством устаревшего кода, и это может быть не идеальное решение.

Итак, мой вопрос - это лучший способ продвижения вперед. Подклассифицирует процедуру окна управления кнопками жизнеспособный вариант или есть более простой способ?

Большое спасибо заранее.

+0

Если окно имеет фокус, оно должно получать ввод ключа, без необходимости настраиваемого цикла. Вы исследовали с помощью Spyxx? –

+0

Я согласен, но я предполагаю, что управление кнопкой имеет дело с нажатиями клавиш внутри. Мне нужно в основном убедиться, что если кнопка имеет фокус, и пользователь нажимает клавишу ввода, которую вызывается обработчиком OnClick. –

+0

Если вы используете существующий класс управления, не можете ли вы просто подклассифицировать окно proc для перехвата ваших сообщений? –

ответ

4

Замечания, приведенные выше, верны. Кнопка с фокусом должна получать ключевые сообщения. Но кнопки не (сами по себе) отвечают на Enter - они отвечают на Space. Похоже на то, что вам не хватает, это типичная навигация по клавиатуре на клавиатуре, например клавиша Tab, перемещая фокус и Enter, активируя кнопку «по умолчанию».

Если у вас есть типичный насос сообщений Windows, и вы хотите, чтобы поведение клавиатуры обычно ассоциировалось с диалоговыми окнами, вам необходимо использовать API IsDialogMessage в вашем цикле сообщений. Это означает, что ваше окно по сути является «немодальным диалогом».

+0

Спасибо за ответ Адриан. Проблема в том, что главное окно - это просто окно, а не диалог. Как уже упоминалось, мне приходится работать с большим количеством устаревшего кода. Я предполагаю, что IsDialogMessage подходит только в том случае, если основной цикл представляет собой цикл диалогового сообщения, а не стандартный цикл winmain? –

+0

Извинения, я прочитал ссылку, которую вы предложили. Кажется, вы действительно можете использовать любое окно. Возможно, это маршрут, на который мне нужно заглянуть. –

+0

Да, вы можете использовать его с любым окном. Вам просто нужно отслеживать, какое окно (или окна) вы хотите для поведения клавиатуры, поскольку вам нужно передать дескриптор окна в функцию. –

0

Похоже, что стандартное окно подкласса proc должно делать трюк. См. http://msdn.microsoft.com/en-us/library/windows/desktop/ms633591(v=vs.85).aspx.

+0

Спасибо Скотту. Я должен спросить, если я подклассифицирую элемент управления Button и использую CallWindowProc, моя подклассифицированная кнопка все еще использует темы и т. Д. Не проблема в настоящее время, но, возможно, когда я займусь Windows 7/8 и т. Д. Я только спрашиваю, как я полагаю, позже версии Windows используйте другой метод для подкласса. –

+0

Абсолютно - ваш крючок должен быть очень неинтрузивным, только наблюдение и обработка WM_KEYDOWN и т. Д. –

+0

ok, final question :-) Когда лучше всего вставить мой WNDPROC, следуя родительскому уведомлению для WM_CREATE, в моей процедуре крючка CBT и т. д. Спасибо :-) –

Смежные вопросы