Bonjour,

Je voudrais qu'une de mes CDialog surveille l'évènement d'appui sur une touche du clavier. J'ai donc commencé par ajouter ON_WM_KEYDOWN dans le message map et surchargé la méthode OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags).

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
BEGIN_MESSAGE_MAP(CDlgToolBar, CDialog)
     ON_WM_KEYDOWN()
END_MESSAGE_MAP()
 
...
 
void CDlgToolBar::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFLags)
{
     switch(nChar)
     {
          case VK_NUMPAD5 :
          {
               // Mon code
               break ;
          }
     }
}
Cela n'a pas marché. En cherchant un peu partout j'ai trouvé des dizaines de fois la même solution qui apparemment a fonctionné chez beaucoup de personnes ( par exemple) : il suffit de surcharger PreTranslateMessage.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
BOOL CDlgToolBar::PreTranslateMessage(MSG * pMsg)
{
     if (pMsg->message == WM_KEYDOWN)
     {
          switch (pMsg->wParam)
          {
               case VK_NUMPAD5 :
               {
                   // Même code.
                   break
               }
          }
     }
 
     return CDialog::PreTranslateMessage(pMsg) ;
}
Malheureusement chez moi, ça ne fonctionne toujours pas. La méthode PreTranslateMessage reçoit énormément de message, mais jamais WM_KEYDOWN (ni rien d'ailleurs qui ait un rapport avec le clavier). Quelqu'un aurait une idée d'une grosse bêtise que j'aurais pu commettre ?

Merci beaucoup.

Précision : comme j'avais cru comprendre qu'il s'agissait d'un problème de focus (un des enfants de la CDialog aurait le focus, et donc la CDialog elle-même ne l'aurait pas), j'ai fait un SetFocus() à la fin de OnInitDialog pour être sûr de l'avoir, mais ça n'a pas marché non plus.