Case WM_KEYDOWN marche pas quand je suis dans un contrôle. [Résolu]

Signaler
Messages postés
29
Date d'inscription
jeudi 24 mars 2005
Statut
Membre
Dernière intervention
29 mai 2009
-
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
-
Bonjour,
Quand je lance mon programme et que j'appuie sur la touche Entrer, le programme va bien dans VK_RETURN et exécute "SendMessage(MaFenetre, WM_COMMAND, ID_B_ENVOYER, 0);".
Si je met mon curseur dans un contrôle (par exemple editbox), quand j'appuie sur Entrer, rien ne se passe :S.
Comment puis-je faire ?
Voici mon code :
/************************************/
        case WM_KEYDOWN:
            switch(wParam)
            {
                case VK_RETURN:
                    SendMessage(MaFenetre, WM_COMMAND, ID_B_ENVOYER, 0);
                    break;
                default:
                    break;
            }
            return 0;
/************************************/
J'ai une autre question :
J'aimerais savoir si c'est possible de donner le focus à mon editbox en cliquant sur un bouton.
Du genre :
case "clique bouton" :
setfocus(editbox);         // c'est cette ligne qu'il me faudrait, si c'est possible.

Merci,
Damien

6 réponses

Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
SetFocus(hButtonWnd) tout simplement.
Pour ton problème y a une source déposée récemment traitant d'un truc similaire (MOUSEMOVE sur un contrôle).
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Salut,
Tu crées un bouton , visible ou non, ayant comme style BS_DEFPUSHBUTTON et comme identificateur IDOK comme ceci:
hBouton=CreateWindowEx(0, "Button", "Ok",
WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON  , 20, 20, 60,
20, hwndparent, (HMENU)IDOK, 0, 0);
A l'appui sur la touche Entrée, et ce quelque soit le controle ayant le focus, ta fenêtre mère recevra WM_COMMAND avec le hwnd du bouton et son identificateur. A toi de choisir lequel des deux utiliser.
Si le parent est une boite de dialogue tout marchera directement. Si c'est une fenêtre normale, la boucle des messages devrait ressembler à ceci:
MSG Msg;
while (GetMessage(&Msg, NULL, 0, 0))
{
    if (!IsDialogMessage(hwnd, &Msg))
    {
    TranslateMessage(&Msg);
    DispatchMessage(&Msg);
    }
}
Messages postés
29
Date d'inscription
jeudi 24 mars 2005
Statut
Membre
Dernière intervention
29 mai 2009

pour ma première question, c'est ok, merci.

Mais pour la deuxième, je n'ai pas trouvé le post correspondant à MOUSEMOVE. Si tu as le lien, se m'aiderait...

Damien
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
C'est la source de rt15 encore dans la liste du sommaire, "savoir quand la souris est sur un contrôle".
Messages postés
29
Date d'inscription
jeudi 24 mars 2005
Statut
Membre
Dernière intervention
29 mai 2009

merci beaucoup, sa marche au top !
Saurait tu me dire ce qu'est exactement IsDialogMessage(hwnd, &Msg), histoire de comprendre un peu .
Je ne même pas eu besoin de mettre un "case" pour l'appui sur "Enter".
On dirait que sa quand on appui sur entré, sa actionne le bouton ayant l'identifiant le plus petit :
#define ID_M_ENVOYER      1
Quand je met "#define ID_B_EFFACER" à 1 et "#define ID_M_ENVOYER" à 2 alors quand j'appui sur entré, sa actionne effacer.
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Une boite de dialogue a sa propore boucle des messages. Cette dernière traite les messages du clavier comme l'appui sur les touches TAB, Enter, les flèches etc. Ce n'est pas le cas avec les fenêtres normales. IsDialogMessage() permet de vérifier si ces messages sont traités. Si oui elle retourne 1, sinon elle retourne 0. Elle retournera donc 0 pour une  fenêtre. Dans ce cas, on appelle TranslateMessage() et DispatchMessage() afin de les transmettre à la procédure de la fenêtre.
Le comportement que tu as remarqué est tout à fait normal car 1 correspond à l'identificateur IDOK comme défini dans winuser.h:
#define IDOK                1
#define IDCANCEL            2
#define IDABORT             3
#define IDRETRY             4
#define IDIGNORE            5
#define IDYES               6
#define IDNO                7
Evite donc de réutiliser les valeurs d'identificateurs déjà utilisées. Tu peux prendre des valeurs supérieures à 100 par exemple.