Gestion de la saisie au clavier dans win32, WM_CHAR ou WM_KEYDOWN / WM_KEYUP?
Donc dans l'éditeur de texte que j'ai travaillé, j'ai utilisé WM_CHAR pour traiter l'entrée à partir du clavier. Cependant, j'ai trouvé que certains traits de caractère messages ne sont pas enregistrés. Par exemple, si j'utilise la touche [shift]+ touche numérique pour saisir un symbole tel que % ou &, certains enregistré tandis que d'autres comme [shift]+9 (qui se traduit par ')'), ne sont pas enregistrés. Donc, je me demandais si je devrais utiliser WM_KEYDOWN/WMKEYUP paire de poignée de saisie au clavier. Une fois, j'ai écrit un keylogger dans l'assemblée(en fait c'était juste un tutoriel que j'ai essayé) et avait utilisé WM_KEYDOWN/WM_KEYUP paires et ça a fonctionné assez bien. Donc, dois-je passer à cela, ou est-il quelque chose d'inhabituel qui se passe avec mon programme?
Merci,
Devjeet
source d'informationauteur devjeetroy
Vous devez vous connecter pour publier un commentaire.
C'est vraiment une longue réponse à votre commentaire ci-dessus, mais en les plaçant dans une réponse parce que c'est trop long pour un commentaire 🙂
Le cœur de la question à comprendre ici est que les clés et les personnages ne sont pas tout à fait la même chose. Certains (mais pas tous) les touches de générer des caractères, certaines touches de générer des caractères différents en fonction de décalage ou d'une autre à l'état du clavier. Et de mettre en œuvre un éditeur, vous devez gérer à la fois les textes et aussi des non-textuels entrée au clavier comme les touches fléchées. Maintenant, le long-winded version, tuant de ce qui semble être une hypothèse incorrecte:
Semble que vous pourriez être un mélange de deux choses ici. La chose avec WM_CHAR est qu'il vous donne les codes de caractères pour le texte des caractères: donc si quelqu'un appuie sur la touche 9, vous aurez '9'. Si quelqu'un appuie sur MAJ+9, Windows va prendre le passage de l'état de compte et vous obtenez '(' (si vous utilisez un clavier AMÉRICAIN). Mais vous ne serez jamais obtenir un WM_CHAR pour les touches fléchées, la MAISON, la FIN, et ainsi de suite, car ils ne sont pas textuelles caractères. WM_KEYDOWN, d'autre part, ne s'occupe pas des personnages, mais dans VK_ codes; de sorte appuyant sur 9 vous donne VK_9 indépendamment de l'état de décalage; et la flèche gauche vous donne VK_LEFT - encore une fois quel que soit de changement d'état.
Les choses, c'est que WM_CHAR et WM_KEYDOWN à la fois de vous donner deux pièces de l'ensemble de la saisie de l'image - mais vous avez vraiment de gérer à la fois pour obtenir l'image complète. Et doivent être conscients que le wParam est une chose très différente dans les deux cas. C'est un code de caractère pour WM_CHAR, mais un VK_ code pour WM_KEYDOWN. Ne pas mélanger les deux.
Et pour rendre les choses plus confuses, VK_ valeurs partagent les mêmes valeurs que les caractères valides. Ouvrir WinUser.h (c'est dans l'comprennent dir sous le compilateur installation dir), et VK_LEFT:
S'avère que 0x25 est aussi le code pour le caractère ' % ' (voir tout ascii/unicode tableau pour plus de détails). Donc, si WM_CHAR obtient 0x25, cela signifie maj-5 a été pressée (en supposant que NOUS le clavier) pour créer un '%'; mais si WM_KEYDOWN obtient 0x25, cela signifie flèche vers la gauche (VK_LEFT) est enfoncée. Et pour ajouter un peu plus de confusion, le Virtuel codes de Clé pour l'A-Z touches et les touches 0 à 9 sont les mêmes que le 'A'-'Z' et de '0'-'9' personnages - qui donne l'impression d'caractères et VK_ sont interchangeables. Mais ils ne le sont pas: le code pour le " a " minuscule, 0x61, est VK_NUMPAD1! (Afin d'obtenir 0x61 dans WM_CHAR signifie "un", qu'il WM_KEYDOWN signifie PAVNUM1. Et si un utilisateur ne frappez la touche 'A' dans unshifted état, ce que vous obtenez en fait, est d'abord une VK_A (même valeur que 'A') dans WM_KEYDOWN, qui se traduit à WM_CHAR de 'a'.)
Afin de lier tout cela ensemble, typique de la façon de gérer le clavier est d'utiliser tous les éléments suivants:
Utilisation WM_CHAR pour gérer les textes: texte de clés. wParam est le caractère que vous voulez ajouter à votre chaîne, ou n'importe quoi d'autre. De ce fait toutes les maj de traitement pour vous.
Utilisation WM_KEYDOWN à gérer "méta" clés " - comme les touches fléchées, début, fin, page précédente, et ainsi de suite. Passer tous les A-Z/0-9 valeurs à travers, la gestion par défaut seront les transformer en WM_CHARs que vous pouvez gérer dans votre WM_CHAR gestionnaire. (Vous pouvez également gérer les touches du pavé numérique ici si vous voulez les utiliser pour des fonctionnalités spéciales; sinon, ils "tombent" en fin numériques WM_CHARs, en fonction verrouillage du pavé numérique de l'état. Windows prend en charge, tout comme il gère état de décalage pour les touches alphanumériques).
Si vous souhaitez gérer ALT - combos explicitement (plutôt que d'utiliser un accélérateur de table), vous obtiendrez ces via WM_SYSKEYDOWN.
Je pense qu'il y a certaines touches qui peuvent se présenter dans les deux - Entrée peut se montrer à la fois comme un WM_KEYDOWN de VK_RETURN et comme \r ou \n WM_CHAR - mais ma préférence serait de le manipuler en WM_KEYDOWN, pour garder l'édition de traitement de la touche distincte de texte touches.
Spy++ vous montrera les messages qui sont envoyés à une fenêtre, de sorte que vous pouvez expérimenter et de voir quels sont les messages appropriés à votre application.
Si vous avez Visual Studio est installé, il doit être dans votre menu Démarrer, dans le cadre de Programmes -> Microsoft Visual Studio -> Outils de Visual Studio -> Spy++.