IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

WM_KEYDOWN sur CDialog


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 26
    Par défaut
    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.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 26
    Par défaut
    J'ai essayé en utilisant les accélérateurs (méthode décrite ici), et même là ça ne fonctionne pas.

    Du coup j'en viens à me poser une question : le programme que j'écris est une DLL pour un autre programme. Est-il possible que ce programme principal intercepte les message de type WM_KEYDOWN et autres pour son propre compte (il y a des raccourcis clavier dans ce logiciel) et du coup m'en interdit l'usage, soit parce qu'ils sont mal redirigés, soit parce que je ne les réclame pas comme il faut ?

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 455
    Par défaut
    Vérifiez avec Spy++, les messages qui transitent.

    Et oui, l'exécutable ou tout autre Dll peut faire des cochonneries pour intercepter les messages.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 26
    Par défaut
    En fait j'ai reçu une réponse aujourd'hui de l'éditeur du logiciel. L'hypothèse des messages interceptés par l'exécutable principal est bien la bonne. C'est vrai que je n'ai pas pensé à Spy++, ça m'aurait sûrement fait gagner beaucoup de temps.

    Dans le même temps, j'ai mis en place un hook qui devrait me sortir d'affaire, une fois que j'aurai compris pleinement son fonctionnement.

Discussions similaires

  1. Réponses: 0
    Dernier message: 22/10/2008, 14h32
  2. Questions sur CDialog
    Par cjacquel dans le forum MFC
    Réponses: 1
    Dernier message: 24/01/2007, 10h01
  3. Réponses: 7
    Dernier message: 10/05/2006, 11h51
  4. Grouper des élements sur un CDialogs
    Par firejocker dans le forum MFC
    Réponses: 11
    Dernier message: 28/11/2005, 15h20
  5. Réponses: 9
    Dernier message: 23/02/2004, 19h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo