!!! Bloquer touche entrée !!! [Résolu]

Signaler
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
-
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
-
Salut,

j'arrive pas à empêcher un retour à la ligne dans une richedit multiligne quand l'utilisateur appuie sur entrée.
Je m'explique.
Ca me servirait pour un chat, et je voudrais que là où l'utilisateur tape son texte, le retour à la ligne ne se fasse que si il appuie en même temps sur Ctrl+Entrée.
Parce que la touche Entrée me sert à envoyer le message et donc pour l'instant ça merde.
Je me sert des hook mais impossible de bloquer le retour chariot.
J'ai cherché des sources mais j'en ai pas trouvé.
Donc si vous en avez ou des exemples, allez-y, envoyez !!!

Merci d'avance.

YOYO, @+.

:big) YOYO ;)

7 réponses

Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Salut,
Je pense que la meilleure solution t'a été proposée par BruNews. Tu dois sous-classer ton richedit. Le principe du sous-classement est simple. Tu crée une procédure d'interception des messages destinés au richedit. Cette procédure ne traitera que le message WM_KEYDOWN (et WM_CHAR) en retournant 0 quand il s'agit de VK_RETURN. Si tu veux utiliser la touche ENTREE pour envoyer les mots tapés, tu appelle la fonction d'envoie juste avant de retourner 0. Ainsi, le richedit ne recevra jamais le signal de l'appui sur cette touche. Tous les autres messages seront transmis à la procédure originale du richedit pour ne pas perturber son comportement. Cette procédure est invisible, c'esr elle qui gère le fonctionement du richedit.
Voici le prototype d'une procédure de sous-classement:
LRESULT CALLBACK MaProcedure (HWND,UINT,WPARAM,LPARAM);

Pour obtenir l'adresse de la procédure du richedit et la remplacer par l'adresse de la notre on utilise la fonction SetWindowLong():
WNDPROC richeditProc=(WNDPROC) SetWindowLong(hrichedit, GWL_WNDPROC, (LPARAM)MaProcedure);

hrichedit est le handle HWND du richedit.
Voici l'exemple de la procédure de sous-classement:
LRESULT CALLBACK MaProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     switch (message) 
     {
     case WM_GETDLGCODE:
               return (DLGC_WANTALLKEYS | CallWindowProc  (richeditProc, hwnd, message, wParam, lParam));

    case WM_CHAR:
      if ((wParam == VK_RETURN) return 0;
      break;

      case WM_KEYDOWN:
      if ((wParam == VK_RETURN))
      {
       // ici appel de la fonction d'envoi des mots tapés
      return 0;
      }
      break;
      }
return CallWindowProc(richeditProc, hwnd, message, wParam, lParam);
}


Voila, j'espère que c'est assez clair.
Messages postés
293
Date d'inscription
jeudi 21 août 2003
Statut
Membre
Dernière intervention
10 avril 2015
2
ba si je comprend ton probleme, pour le resoudre il suffi de programmer un truc dans ce genre :

bool control_actif
si apui sur control alors
control_actif = true
si relachement control alors
control_actif = false
si apui sur entre et control_actif = true alors ....

:big) Adeon 8-)
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
Sous classe ton richedit et traite WM_KEYDOWN dans la proc de sous classement.

ciao...
BruNews, MVP VC++
Messages postés
546
Date d'inscription
vendredi 13 février 2004
Statut
Membre
Dernière intervention
9 janvier 2008
1
Au pire tu mets entrée pour le retour a la ligne et E pour envoyer par exemple...
Sinon pour ton prob...je pense qu'il ya un buffer ou le code de la touche enfoncé est stocké et celui ci ne doit pas etre encore effacé au moment ou tu detecte le retour chariot apres avoir envoyé....
C'etait juste une piste...mais tu dois surement y avoir deja pensé...
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
Alors là racpp, j'ai qu'un mot à dire GENIAL !!!
Non seulement c'est ce que je cherchais mais en plus c'est super bien expliqué, moi qui craignais le sous-classement, en fait vu comme ça, ça l'est pas du tout.
Par contre je suis obligé de mettre le SetWindowLong(...) dans le WM_SIZE, parce qu'il ne fonctionne pas si je le mets dans WM_CREATE.
En tout cas, un énorme MERCI à toi racpp !

YOYO, @+.

:big) YOYO ;)
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Salut,
Très content de t'avoir un peu aidé. Ca fait toujours plaisir.
A propos de SetWindowLong(), il est préférable de la mettre juste après la création du RichEdit avec CreateWindowEx() pendant le traitement du message WM_CREATE. La variable "richeditProc" doit être déclarée de manière globale pour qu'elle soit accessible dans toutes les fonctions du programme, et surtout dans la procédure de sous classement. C'est un détail que j'avais omis pour ne pas brouiller l'explication. Voici un exemple:
#include <windows.h>
// ici les autres include 
WNDPROC richeditProc; // déclaration globale

Dans la procédure de ta fenêtre principale tu fais:
case WM_CREATE:
//......
hrichedit=CreateWindowEx(.........);
richeditProc=SetWindowLong(.......);
//......


Bonne programmation!
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
Je te remercie à nouveau racpp(décidément ça continue ;-D).
J'avais réussi à le faire moi-même. C'est que je créais tous les composants (boutons, edits, ...) hors de WM_CREATE et donc ça créait ma fenêtre mais le sous-classement se faisait avant la création de la richedit et tout le toin-toin.

Merci encore racpp.

YOYO, @+.

:big) YOYO ;)