I just create a dialog-based project in MFC (VS2008) and add OnKeyDown
event to the dialog.
When I run the project and press the keys on the keyboard, nothing happens. But, if I remove all the controls from the dialog and rerun the project it works.
What should I do to get key events even when I have controls on the dialog?
Here's a piece of code:
void CgDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
AfxMessageBox(L"Key down!");
CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}
Many of my CDialog apps use OnKeyDown(). As long you only want to receive key presses and draw on the screen (as in make a game), delete the default buttons and static text (the CDialog must be empty) and OnKeyDown() will start working. Once controls are placed on the CDialog, OnKeyDown() will no longer be called.
When a dialog has controls on it, the dialog itself never gets the focus. It's stolen by the child controls. When you press a button, a
WM_KEYDOWN
message is sent to the control with focus so yourCgDlg::OnKeyDown
is never called. Override the dialog'sPreTranslateMessage
function if you want dialog to handle theWM_KEYDOWN
message:Also see this article on CodeProject: http://www.codeproject.com/KB/dialog/pretransdialog01.aspx