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 :

Bloquer les effets de la touche "Verr Maj" (Caps Lock) dans un CEdit


Sujet :

MFC

  1. #1
    Membre éclairé
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Points : 749
    Points
    749
    Par défaut Bloquer les effets de la touche "Verr Maj" (Caps Lock) dans un CEdit
    Bonjour à tous,

    Certains de mes utilisateurs, pas très au point au niveau informatique, aiment écrire intégralement en majuscules. Moi, je ne veux pas de ça dans mon appli. Je cherche donc un moyen d'annuler les effets de la touche "Verr Maj" dans les EDIT de mon appli.
    J'ai un début avec la macro IsCapsLocked dont je parle dans ma précédente discussion, mais à part ça, je suis un peu bloqué.
    Je pensais le faire dans la méthode PreTranslateMessage d'une classe dérivée de CEdit, mais je n'y arrive pas. Quelqu'un aurait-il une idée de comment faire ?

    Merci de votre aide !

  2. #2
    Membre éclairé
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Points : 749
    Points
    749
    Par défaut
    Voici ce que j'avais pensé faire et qui ne marche pas :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    BOOL CMonEdit::PreTranslateMessage(MSG* pMsg)
    {
    	if (pMsg && (pMsg->message == WM_KEYDOWN))
    	{
    		if (IsCapsLocked() && (pMsg->wParam != 20) && (pMsg->wParam != 16))
    			if (m_bloquerVerrMaj)
    			{
    				m_bloquerVerrMaj = false;
     
    				if (IsShiftDown())
    				{
    					PostMessage(WM_KEYUP, VK_SHIFT);
    					PostMessage(WM_KEYDOWN, pMsg->wParam);
    					PostMessage(WM_KEYDOWN, VK_SHIFT);
    					return TRUE;
    				}
     
    				PostMessage(WM_KEYDOWN, VK_SHIFT);
    				PostMessage(WM_KEYDOWN, pMsg->wParam);
    				PostMessage(WM_KEYUP, VK_SHIFT);
    				return TRUE;
    			}
    			else
    				m_bloquerVerrMaj = true;
    	}
     
    	return CEdit::PreTranslateMessage(pMsg);
    }
    m_bloquerVerrMaj est un bool initialisé à true dans le constructeur.

    Je pensais donc intercepter les frappes sur les touches avec la touche "Verr Maj" activée et les transformer en simulant la touche "Maj" enfoncée si elle ne l'est pas, ou relachée si elle l'est, de façon à annuler l'effet de la touche "Verr Maj".
    Résultat : l'effet de la touche "Verr Maj" n'est pas annulé...

  3. #3
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    tu interceptes WM_CHAR et tu fais un CString::MakeLower .
    tu réaffectes le résultat au char passé en argument, et tu rappels la fonction de la classe de base.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Points : 347
    Points
    347
    Par défaut
    Bonjour

    moi j'intercpeterais le Message EN_CHANGE de la CEdit.
    je mettrais le contenu de la CEdit dans un CString
    et uliliserais la methode Makelower sur le CString pour le recrire dans la CEdit

    Cordialement

  5. #5
    Membre éclairé
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Points : 749
    Points
    749
    Par défaut
    Ricky78 --> En fait je ne peux pas faire comme ça car il doit quand même être possible d'écrire en majuscule dans le champ, en appuyant sur la touche "Maj". Si je mets d'office le texte en minuscules, ce ne sera pas possible...

    J'ai donc essayé la méthode de Farscape, mais je n'ai pas dû faire comme il faut car ça ne marche pas. Voici mon code :
    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
    19
    20
    21
    22
    23
    void CMonEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
    {
    	if (GetStyle() & ES_READONLY)
    		return;
     
    	if (IsCapsLocked())
    	{
    		if (IsShiftDown())
    		{
    			CString sChar = CString(char(nChar));
    			sChar.MakeUpper();
    			nChar = (UINT) (sChar.GetAt(0));
    		}
    		else
    		{
    			CString sChar = CString(char(nChar));
    			sChar.MakeLower();
    			nChar = (UINT) (sChar.GetAt(0));
    		}
    	}
     
    	CEdit::OnChar(nChar, nRepCnt, nFlags);
    }
    Avec le debugueur j'ai pu constater que la conversion du caractère avait bien lieu, mais au final ça ne se voit pas à l'affichage...

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    en faisant comme suit ça devrait fonctionner :
    http://cpp.developpez.com/faq/vc/?pa...EditChangeChar

  7. #7
    Membre éclairé
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Points : 749
    Points
    749
    Par défaut
    Voici ce que j'ai fait :
    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
    19
    20
    21
    22
    23
    24
    25
    void CMonEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
    {
    	if (GetStyle() & ES_READONLY)
    		return;
     
    	if (IsCapsLocked())
    		if (m_bloquerVerrMaj)
    		{
    			CString sChar = CString(char(nChar));
     
    			if (IsShiftDown())
    				sChar.MakeUpper();
    			else
    				sChar.MakeLower();
     
    			if (PostMessage(WM_CHAR, (UINT) (sChar.GetAt(0))))
    				m_bloquerVerrMaj = false;
     
    			return;
    		}
    		else
    			m_bloquerVerrMaj = true;
     
    	CEdit::OnChar(nChar, nRepCnt, nFlags);
    }
    m_bloquerVerrMaj est un bool initialisé à true dans le constructeur.

    Ca marche très bien pour les touches normales. Mais ça ne fonctionne pas pour les touches de ponctuation et celles des chiffres (hors pavé numérique)...

  8. #8
    Membre éclairé
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Points : 749
    Points
    749
    Par défaut
    Je pense que ma première approche, à partir de la méthode PreTranslateMessage pourrait être une solution plus facile à mettre en oeuvre. Si seulement je comprenais pourquoi ce que j'ai fait ne fonctionne pas...

  9. #9
    Membre éclairé
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Points : 749
    Points
    749
    Par défaut
    J'abandonne.
    En fait, j'ai réussi à désactiver la touche en simulant une frappe dessus de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (IsCapsLocked())
    {
    	keybd_event(VK_CAPITAL, MapVirtualKey(VK_CAPITAL, 0), 0, 0);
    	keybd_event(VK_CAPITAL, MapVirtualKey(VK_CAPITAL, 0), KEYEVENTF_KEYUP, 0);
    }
    Mais j'aurais préféré faire autrement car dans le cas de mon clavier, cela affiche "Ver. Maj désactivé" en gros à l'écran...

    J'avais pensé simuler, de la même façon, la frappe sur la touche "Maj" pour annuler l'effet de "Verr Maj", mais cela ne fonctionne pas quand l'utilisateur appuie déjà dessus. Pire, ça fait ensuite comme si la touche était appuyée en permanence...

    J'ai donc abandonné l'idée d'annuler les effets de cette touche dans mes CEdit pour pour désactiver la touche une seule fois au lancement de l'application, en en avertissant l'utilisateur.

Discussions similaires

  1. Bloquer les touches du clavier
    Par Heilong dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 27/11/2007, 10h20
  2. Bloquer les Touches Ctrl+Alt+Suppr
    Par allan02390 dans le forum C++
    Réponses: 4
    Dernier message: 24/10/2007, 11h55
  3. Réponses: 8
    Dernier message: 20/08/2007, 16h37
  4. Réponses: 1
    Dernier message: 22/09/2005, 20h46

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