Почему OnKeyDown не перехватывает ключевые события в диалоговом проекте MFC? - PullRequest
5 голосов
/ 15 января 2011

Я просто создаю проект на основе диалога в MFC (VS2008) и добавляю в диалог событие OnKeyDown. Когда я запускаю проект и нажимаю клавиши на клавиатуре, ничего не происходит. Но если я уберу все элементы управления из диалогового окна и перезапущу проект, он будет работать. Что я должен сделать, чтобы получить ключевые события, даже когда у меня есть элементы управления в диалоговом окне?

Вот кусок кода:

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

Ответы [ 2 ]

18 голосов
/ 15 января 2011

Когда диалог имеет элементы управления, сам диалог никогда не получает фокус.Это украдено детским контролем.Когда вы нажимаете кнопку, на элемент управления отправляется сообщение WM_KEYDOWN с фокусом, поэтому ваш CgDlg::OnKeyDown никогда не вызывается.Переопределите функцию PreTranslateMessage диалогового окна, если вы хотите, чтобы диалог обрабатывал сообщение WM_KEYDOWN:

BOOL CgDlg::PreTranslateMessage(MSG* pMsg)
{
   if(pMsg->message == WM_KEYDOWN   )  
   {
      if(pMsg->wParam == VK_DOWN)
      {
         ...
      }
      else if(pMsg->wParam == ...)
      {
         ...                      
      }
      ...
      else
      {
         ...                   
      }
   }

   return CDialog::PreTranslateMessage(pMsg);  
}

.

0 голосов
/ 23 сентября 2011

Многие из моих приложений на CDialog используют OnKeyDown (). Пока вы хотите получать только нажатия клавиш и рисовать на экране (как в игре), удалите стандартные кнопки и статический текст (CDialog должен быть пустым), и OnKeyDown () начнет работать. После размещения элементов управления на CDialog OnKeyDown () больше не будет вызываться.

...