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

Windows Discussion :

message WM_KEYUP et caractère.


Sujet :

Windows

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 340
    Points : 177
    Points
    177
    Par défaut message WM_KEYUP et caractère.
    Je voudrais récupérer le caractère associé à un WM_KEYUP. Par exemple si je relache la touche correspondant à la lettre A, je voudrais récupérer le caractère 'a' (97) et non la keycode 'A' (65). Pas de problème avec WM_KEYDOWN car TranslateMessage() envoie WM_CHAR et je récupère correctement le caractère.

    J'ai fais pas mal de recherches sur google et j'ai vu plusieurs posts où la fonction MapVirtualKey() est utilisée. J'ai essayé donc de l'utiliser aussi, sans succès : j'ai toujours le keycode qui est retourné, et non le caractère.

    J'ai aussi essayé d'appeler TranslateMessage() dans le callback du KEYUP, mais pareil, sans succès (toujours le keycode).

    Donc je voudrais savoir si c'est possible, et si oui, comment (si c'est avec MapVirtualKey(), comment l'utiliser correctement)

    Merci
    L'Opus attire les Prélats

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 688
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    Regarde ToAscii(Ex) ou ToUnicode(Ex).

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 340
    Points : 177
    Points
    177
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Regarde ToAscii(Ex) ou ToUnicode(Ex).
    ca ne marchera pas. Ce que j'ai est uniquement le virtual key code. Autant pour les claviers utilisant notre alphabet, je peux m'en sortir, autant pour des claviers ne l'utilisant pas, c'est inutile. Je pourrais juste utiliser tolower(), ou bien faire juste une petite addition pour obtenir le bon caractère, mais c'est un mauvais hack.
    L'Opus attire les Prélats

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 688
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    Citation Envoyé par dd'Oursse Voir le message
    ca ne marchera pas.
    Merci pour la confiance

    Citation Envoyé par dd'Oursse Voir le message
    Ce que j'ai est uniquement le virtual key code.
    Et c'est tout ce qu'il te faut !

    Citation Envoyé par dd'Oursse Voir le message
    Autant pour les claviers utilisant notre alphabet, je peux m'en sortir, autant pour des claviers ne l'utilisant pas, c'est inutile.
    Pourtant quand tu lis "Unicode", ça devrait faire tilt!

    La fonction attend le VK et tu l'as, le ScanCode que tu peux facilement déterminer par MapVirtualKey et l'état actuel de toutes les touches que tu récupères par GetKeyboardState. Ça me semble suffisant

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 340
    Points : 177
    Points
    177
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    La fonction attend le VK et tu l'as, le ScanCode que tu peux facilement déterminer par MapVirtualKey et l'état actuel de toutes les touches que tu récupères par GetKeyboardState. Ça me semble suffisant
    alors, j'aimerais avoir des explications : MapVirtualKey(wparam, MAPVK_VK_TO_CHAR) me renvoie le keycode et non le scancode (pour la touche 'a', MapVirtualKey() me renvoie 'A'). Donc je ne vois pas en quoi ça m'aide.
    L'Opus attire les Prélats

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 688
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut


    MAPVK_VK_TO_VSC : The uCode parameter is a virtual-key code and is translated into a scan code.
    C'est une façon de faire, mais tu peux aussi le récupérer directement depuis WM_KEYUP - LParam

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 340
    Points : 177
    Points
    177
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    C'est une façon de faire, mais tu peux aussi le récupérer directement depuis WM_KEYUP - LParam
    j'ai déjà essayé tout ça. Néanmoins je te donne mes résultats. Après avoir appuyé sur la touche 'a' :

    (lParam >> 16) && 0xff : renvoie la valeur 1
    MapVirtualKey(wParam,MAPVK_VK_TO_CHAR) : renvoie la valeur 65
    MapVirtualKey(wParam,MAPVK_VK_TO_VSC) : renvoie la valeur 16

    il me faudrait 97
    L'Opus attire les Prélats

  8. #8
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 688
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    Citation Envoyé par d'Oursse Voir le message
    MapVirtualKey(wParam,MAPVK_VK_TO_VSC) : renvoie la valeur 16
    Et c'est correct pour un clavier AZERTY

    Citation Envoyé par d'Oursse Voir le message
    il me faudrait 97
    Arrête de réfléchir en ascii. Ce que tu veux est un caractère, point!

    Tu as maintenant les 2 premiers paramètres de ToUnicode. Plus qu'un et gérer le buffer !

  9. #9
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 340
    Points : 177
    Points
    177
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Et c'est correct pour un clavier AZERTY

    Arrête de réfléchir en ascii. Ce que tu veux est un caractère, point!

    Tu as maintenant les 2 premiers paramètres de ToUnicode. Plus qu'un et gérer le buffer !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    WCHAR buf[15];
    int res;
    
    res = ToUnicode(wParam, MapVirtualKey(wParam, MAPVK_VK_TO_VSC), NULL, buf, sizeof(buf), 0);
    valeur de res : 0
    L'Opus attire les Prélats

  10. #10
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 688
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    C'est quoi ce NULL là au milieu ? GetKeyboardState...
    cchBuff est la taille en caractère, pas en octet !

    Sinon, un essai sous Delphi fonctionne parfaitement...

  11. #11
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 340
    Points : 177
    Points
    177
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    C'est quoi ce NULL là au milieu ? GetKeyboardState...
    cchBuff est la taille en caractère, pas en octet !

    Sinon, un essai sous Delphi fonctionne parfaitement...
    faudrait savoir, dans un précédent message tu me dis qu'il faut 3 paramètres, le vk le scancode et le buffer. Je passe sous silence qu'il faut la taille du buffer (au passage, vu que je gère un caractère, la taille du buffer sera suffisamment grande de toute façon). Maintenant il faut passer en plus le keystate.. Tu n'avais qu'à être précis.

    De plus, ce paramètre, vu la doc, est optionnel. Donc ceci et le fait que tu m'as dit qu'il n'y avait que 3 paramètres à passer m'a fait penser que ce paramètre pouvait être NULL...

    tu ne crois pas que me donner directement le code aurait pu éviter une discussion stérile ?

    néanmoins merci d'avoir répondu
    L'Opus attire les Prélats

  12. #12
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 688
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    Et ça va être de ma faute maintenant...

    Le problème est que tu ne lis pas les réponses qui te sont données (ni l'aide d'ailleurs) et si tu veux du code prémâché, en effet tu n'es pas tombé sur la bonne personne

    Citation Envoyé par Andnotor Voir le message
    La fonction attend le VK et tu l'as, le ScanCode que tu peux facilement déterminer par MapVirtualKey et l'état actuel de toutes les touches que tu récupères par GetKeyboardState.
    Citation Envoyé par Andnotor Voir le message
    Plus qu'un et gérer le buffer !
    Citation Envoyé par d'Oursse Voir le message
    tu ne crois pas que me donner directement le code aurait pu éviter une discussion stérile ?
    Tu ne crois pas que j'ai autre chose à f*** que taper ton code ?
    Seulement ton acharnement à ne rien comprendre a fini par me mettre le doute et j'ai fait un essai pour en avoir le coeur net !

  13. #13
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 340
    Points : 177
    Points
    177
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Tu ne crois pas que j'ai autre chose à f*** que taper ton code ?
    Seulement ton acharnement à ne rien comprendre a fini par me mettre le doute et j'ai fait un essai pour en avoir le coeur net !
    c'est vrai que 2 lignes de code, ça prend un temps fou, surtout quand on sait comment faire... Tu as perdu plus de temps à me répondre qu'à écrire ces 2 lignes.

    j'arrête là, c'est ma dernière réponse dans ce thread.
    L'Opus attire les Prélats

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/04/2013, 23h33
  2. Messages d'erreurs + caractères accentués
    Par bamak dans le forum Zend_Form
    Réponses: 3
    Dernier message: 08/04/2011, 17h55
  3. [Lazarus] [0.9.26/Linux] Message avec un caractère accentué
    Par ovni76 dans le forum Lazarus
    Réponses: 9
    Dernier message: 24/01/2009, 19h31
  4. Réponses: 13
    Dernier message: 24/05/2006, 13h53

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