FAQ:WinAPI VCPP:обработка нажания клавиш в CDialog
Материал из Весельчак У
Версия от 22:10, 3 октября 2009; RXL (обсуждение | вклад)
Как в CDialog-based классе получить коды клавиш, которые нажимает пользователь? Пробовал добавлять обработчики OnChar() и OnKeyDown(), но эти обработчики вообще не вызываются.
Диалоги действительно не обрабатывают OnChar() и OnKeyDown(). По этому нужно ловить сообщения WM_CHAR и WM_KEYDOWN в виртуальной PreTranslateMessage().
BOOL CMyDialog::PreTranslateMessage(MSG* pMsg) { if (pMsg->message == WM_KEYDOWN) { // pMsg->wParam - код клавиши // pMsg->hwnd - хендл контрола окна, который получил сообщение // pMsg->lParam - дополнительная информация: // биты 0...15 - количество повторов // биты 16...23 - скан-код // бит 24 -установлен, если нажат правый Ctrl } if (pMsg->message == WM_CHAR) { // pMsg - всё аналогично WM_KEYDOWN } return CDialog::PreTranslateMessage(pMsg); }