В функции PreTranslateMessage можно обработать вообще все сообщения. Отключим обработку акселераторов и напишем код.
BOOL CTestMessageDlg::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class if (pMsg->message==WM_KEYDOWN) { if (pMsg->wParam == VK_ESCAPE) return TRUE; if (pMsg->wParam == VK_RETURN) return TRUE; if (pMsg->wParam == VK_SPACE) return TRUE; } return CDialog::PreTranslateMessage(pMsg); }
Вся идея заключается в изучении структуры MSG. Сначала мы определяем, что нажата клавиша, а потом какая нажата. Вот и все. Кстати можно прямо отсюда вызывать всякие функции при необходимости. Кстати перехватил я и пробел, так как если фокус на кнопке, то пробел действует как Enter.