Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

message WM_KEYUP et caractère

5 réponses
Avatar
Vincent Torri
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

5 réponses

Avatar
Laurent
"Vincent Torri" a écrit dans le message de news:

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)



Faut tester si Caps Lock ou Shift est pressé pour faire la difference, vu
que le lParam est identique
Avatar
Vincent Torri
"Laurent" wrote in news:jau3a9$3ge$:


"Vincent Torri" a écrit dans le message de
news:
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)



Faut tester si Caps Lock ou Shift est pressé pour faire la difference,
vu que le lParam est identique



Ca sera bon pour les caractères alphabétiques uniquement, et pour des
claviers européens, mais pour tout le reste (caractères accentués,
calviers japonais ou corréens, etc...), ça ne marchera pas. L'exemple
avec 'a' était donner juste pour illustrer le problème.

Ce que je me demande est : comment, avec juste le keycode, récupérer la
valeur "caractère" de la touche. Il me semble qu'il faudrait utiliser
TranslateMessage() pour justement "traduire" ce keycode. Mais comme je
l'ai dit, je n'ai pas réussi à l'utiliser correctement (i.e. la fonction
ne traduit rien si je lui passe un MSG remplis avec les données renvoyée
par la procédure des messages)
Avatar
Laurent
"Vincent Torri" a écrit dans le message de news:

Ce que je me demande est : comment, avec juste le keycode, récupérer la
valeur "caractère" de la touche. Il me semble qu'il faudrait utiliser
TranslateMessage() pour justement "traduire" ce keycode. Mais comme je
l'ai dit, je n'ai pas réussi à l'utiliser correctement (i.e. la fonction
ne traduit rien si je lui passe un MSG remplis avec les données renvoyée
par la procédure des messages)



MapVirtualKey() definit ce qu'on veut selon uMapType
Mais pas dans WM_KEYUP vu que lParam ne change pas
(et TranslateMessage() ne s'appelle jamais là non plus)
WM_KEYUP ne se traite d'ailleurs quasiment jamais..
Avatar
torri
On Mon, 28 Nov 2011 09:01:31 +0100, Laurent wrote:

"Vincent Torri" a écrit dans le message de
news:

MapVirtualKey() definit ce qu'on veut selon uMapType Mais pas dans
WM_KEYUP vu que lParam ne change pas (et TranslateMessage() ne
s'appelle jamais là non plus) WM_KEYUP ne se traite d'ailleurs quasiment
jamais..



C'est gênant.

Déjà, je justifie ma question : je participe au développement d'un
ensemble de bibliothèques écrites pour unix (donc Xorg est utilisé pour
la gestion du clavier), et je porte ces bibliothèques sous Windows (donc
j'essaie autant que faire se peut d'avoir le même comportement sous
Windows). Or X permet, pour le keyup, d'avoir le caractère, exactement
comme pour le keydown. Or sous windows, je ne peux apparemment n'avoir
que le virtual key code, ce qui est bien dommage vu ce que je veux faire.

Peut-être que si je mets en cache la valeur lors du keydown, je peux la
récupérer lors du keyup.
Avatar
torri
On Mon, 28 Nov 2011 09:01:31 +0100, Laurent wrote:


MapVirtualKey() definit ce qu'on veut selon uMapType Mais pas dans
WM_KEYUP vu que lParam ne change pas (et TranslateMessage() ne
s'appelle jamais là non plus) WM_KEYUP ne se traite d'ailleurs quasiment
jamais..



apparemment, un truc comme ceci fonctionne (sans la gestion des erreurs) :

GetKeyboardState(kbd_state);
ToUnicode(msg->window_param,
MapVirtualKey(msg->window_param, MAPVK_VK_TO_VSC),
kbd_state, buf, 3, 0);