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);
}