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).
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 (là 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
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 ; } } }
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 ?
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) ; }
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.
Partager