FAQ:WinAPI VCPP:обработка нажания клавиш в CDialog
Материал из Весельчак У
Как в 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);
}