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 :

Savoir si une touche spéciale est enfoncée (Ctrl, Maj, Alt, Verr Maj...)


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 Savoir si une touche spéciale est enfoncée (Ctrl, Maj, Alt, Verr Maj...)
    Bonjour à tous,

    Cette question s'adresse plus particulièrement à Farscape, puisque c'est de lui que je tiens le code suivant (mis dans une macro), qui permet de savoir si la touche Ctrl est enfoncée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GetKeyState(VK_CONTROL) & (1 << (sizeof(SHORT)*8-1))
    Dans cette petite ligne de code, je comprends bien le début GetKeyState(VK_CONTROL), mais je ne comprends pas le reste. A quoi sert-il ?

  2. #2
    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,
    Citation Envoyé par MSDN
    • If the high-order bit is 1, the key is down; otherwise, it is up.
    après 1 << (sizeof(SHORT)*8-1) == 32768 ou 8000 en hexa ou 1000000000000000 en binaire d'où la comparaison avec le & logique.

  3. #3
    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
    Houlala ! Je ne pensais pas que 1 << (sizeof(SHORT)*8-1) voulais simplement dire 1000000000000000 en binaire !
    Le code suivant ne serait-il pas plus simple ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HIWORD(GetKeyState(VK_CONTROL))

  4. #4
    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
    ben non, HIWORD te retourne le mot de poids fort,pas si le bit le plus élevé du mot de poids fort est a 1...

  5. #5
    Membre confirmé Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Points : 521
    Points
    521
    Par défaut
    plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    GetKeyState(VK_CONTROL)<0
    depuis que le bit de poids le plus fort est le bit de signe

    @+

  6. #6
    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
    Merci pour vos réponses. Je commence à comprendre...
    Et quand la MSDN parle de low_order bit, il faut comprendre que c'est le bit le plus à droite ?

  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 donc les macros que j'ai faites à partir de ce que j'ai trouvé dans la FAQ.
    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
    /// <summary>Indique si la touche "Maj" est enfoncée ou non.</summary>
    /// <returns><c>true</c> si la touche "Maj" est enfoncée, <c>false</c> sinon.</returns>
    #define IsShiftDown() ((GetKeyState(VK_SHIFT) & (1 << (sizeof(SHORT)*8-1)))? true : false)
     
    /// <summary>Indique si la touche "Ctrl" est enfoncée ou non.</summary>
    /// <returns><c>true</c> si la touche "Ctrl" est enfoncée, <c>false</c> sinon.</returns>
    #define IsCtrlDown() ((GetKeyState(VK_CONTROL) & (1 << (sizeof(SHORT)*8-1)))? true : false)
     
    /// <summary>Indique si la touche "Alt" est enfoncée ou non.</summary>
    /// <returns><c>true</c> si la touche "Alt" est enfoncée, <c>false</c> sinon.</returns>
    #define IsAltDown() ((GetKeyState(VK_LMENU) & (1 << (sizeof(SHORT)*8-1)))? true : false)
     
    /// <summary>Indique si la touche "Verr Maj" est activée ou non.</summary>
    /// <returns><c>true</c> si la touche "Verr Maj" est activée, <c>false</c> sinon.</returns>
    #define IsCapsLocked() ((GetKeyState(VK_CAPITAL) & 1)? true : false)
    La macro IsCapsLocked est elle bonne ?
    Si j'en crois la MSDN, il faut regarder le "low-order bit" de la fonction GetKeyState(VK_CAPITAL) ; s'il est égal à 1 la touche est activée, sinon elle ne l'est pas.

  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
    Ce qui donne, à la façon simplifiée de Stephdim :
    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
    /// <summary>Indique si la touche "Maj" est enfoncée ou non.</summary>
    /// <returns><c>true</c> si la touche "Maj" est enfoncée, <c>false</c> sinon.</returns>
    #define IsShiftDown() (GetKeyState(VK_SHIFT) < 0)
     
    /// <summary>Indique si la touche "Ctrl" est enfoncée ou non.</summary>
    /// <returns><c>true</c> si la touche "Ctrl" est enfoncée, <c>false</c> sinon.</returns>
    #define IsCtrlDown() (GetKeyState(VK_CONTROL) < 0)
     
    /// <summary>Indique si la touche "Alt" est enfoncée ou non.</summary>
    /// <returns><c>true</c> si la touche "Alt" est enfoncée, <c>false</c> sinon.</returns>
    #define IsAltDown() (GetKeyState(VK_LMENU) < 0)
     
    /// <summary>Indique si la touche "Verr Maj" est activée ou non.</summary>
    /// <returns><c>true</c> si la touche "Verr Maj" est activée, <c>false</c> sinon.</returns>
    #define IsCapsLocked() ((GetKeyState(VK_CAPITAL) & 1)? true : false)

  9. #9
    Membre confirmé Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Points : 521
    Points
    521
    Par défaut
    ça m'a l'air ok

    @+

  10. #10
    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
    Merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Savoir si une touche clavier à été enfoncé JAVA
    Par guimo26 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 24/08/2010, 16h47
  2. Savoir quand une touche est pressé
    Par molina dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 02/12/2008, 13h14
  3. Comment savoir si une fenêtre s'est fermée
    Par niuniuk36 dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 12/05/2005, 14h49
  4. Comment savoir si une impression s'est bien déroulé?
    Par Cyrilh7 dans le forum C++Builder
    Réponses: 5
    Dernier message: 19/11/2003, 20h49
  5. Réponses: 4
    Dernier message: 10/09/2002, 17h09

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