Key infos (getkeystate / getasynckeystate) : utile pour développer des apps nécéssitant la gestion de la frappe clavier

Soyez le premier à donner votre avis sur cette source.

Vue 19 085 fois - Téléchargée 2 132 fois

Description

en fait, j'ai développé ce petit outil sans prétention pour m'aider dans deux choses :

-le developpement d'une autre app ou j'avais souvent besoins de tester les valeurs de certaines touches en ASCII et en KeyCodes assez souvent

-la compréhension des API GetKeyState et GetAsyncKeyState (et de la gestion du clavier en général)

Donc le soft vous affiche les valeurs de chaque touche préssée (ASCII, KeyCodes, et les valeurs des GetKeyState et GetAsyncState correspondant)

Vous constaterez qu'il y a pour certaines touches 2 valeurs de KeyCodes (synchrone et asynchrone, je les ai baptisées ainsi parce que ca me paraissait logique, mais ce n'est probablement pas leur vrai nom)

notemment 'CTRL' 'ALT' 'SHIFT' qui a un code touche et un code fonction

J'ai constaté que dans une boucle, pour tester la valeur d'une touche, ex :

do
if getasynckeystate(keycode)< 0 then
textbox = textbox & latouche
end if
doevents
loop

la valeur est testée sans anti rebond (la touche défile a fond)

alors qu'avec :

do
if getasynckeystate(keycode) = -32767 then
textbox = textbox & latouche
end if
doevents
loop

il y a un anti rebond est la touche défile a la fréquence de répétition parametrée pour le clavier

quand on est en parametres regionnaux English, et un clavier qwerty, ca fonctionne bien sur, sauf la touche ALT GR qui n'a pas le même keycode selon le parametre :
en FR : elle a le keycode synchrone de la touche CTRL (17)
en EN : elle a le keycode synchrone de la touche ALT (18)

j'ai pensé que c'est parce qu'au lieu d'utiliser la sequence CTRL/ALT (a quoi correspond ALTGR) il utilisent ALT/CTRL...
Si quelqu'un peut m'éclairer

Par ailleurs, je ne suis toujours pas sûr de la différence entre GetKeyState et GetAsyncKeyState (GetKeyState est il pour tester les touches synchrones genre pression sur CTRL/ALT/SHIFT en meme temps qu'une autre touche?)

si quelqun le sait, ce serait sympa

voila les sources :

Source / Exemple :


Ziiip!

Conclusion :


Bon, j'aimerais en faire l'arme ultime pour le dev. d'apps clavier, donc y inclure la gestion des parametre régionnaux etc... et trouver l'etat de CAPSLOCK/NUMLOCK/SCROLLLOCK/INS sans passer par la statusbar (APIs?)

Si un pro du clavier passe par là, peut il me confier sa science?

Si ce même pro avait des procédure optimisées pour tout ca, des listes de keycodes, je sais pas, des infos sur les différents types de clavier qui existent et leur gestion (jap, chinois, englais...) et la manière dont tout ca est geré, je suis très curieux là-dessus

Merci a vous

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
51
Date d'inscription
vendredi 20 février 2004
Statut
Membre
Dernière intervention
7 juillet 2006

yes merci gobillot our ton lanternage ;-) ca m'a bien éclairé
vais regarder ce que je peux faire avec les fonctions de l'API que tu m'as donné, ca devrait etre interressant...
Quand a renfield, idem merci pour ta source, ca peut servir ;)

Bon, vais bosser sur mon arme ultime de développement d'app. clavier et je mettrais a jour ;-)

merci a tous,

pekch
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
62
une source qui pourrais t'intéresser :

http://www.vbfrance.com/codes/KEYCODE-ASCII_33577.aspx
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
25
Description GetKeyState:
La fonction GetKeyState retourne le status de la touche virtuelle (virtual-key code) spécifiée. Autrement dit, cette fonction permet de savoir si une touche est enfoncée (toutes les touches du clavier et les boutons de la souris).
La fonction retourne 0 ou 1 lorsque la touche est inactive sinon -128 ou -127 lorsque la touche est enfoncée.

Description GetAsyncKeyState:
Cette fonction permet de connaitre l'état appuyé ou relâché des touches, même si l'application n'est pas active.

donc pour tester une touche:
< 0 --> touche enfonçée
>=0 --> touche au repos

16 --> "Q'
17 --> "W"
je parlais des codes que l'on devrait obtenir directement à partir du port clavier ...!!!

ça se complique:
voilà d'autres fonctions intéressantes, qui sont en rapport avec les Scan Codes, mais j'ai pas trouvé beaucoup de documentation sur elles.

Private Declare Function OemKeyScan Lib "user32" (ByVal wOemChar As Integer) As Long
Private Declare Function CharToOem Lib "user32" Alias "CharToOemA" (ByVal lpszSrc As String, ByVal lpszDst As String) As Long
Private Declare Function VkKeyScan Lib "user32" Alias "VkKeyScanA" (ByVal cChar As Byte) As Integer
Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long
Messages postés
51
Date d'inscription
vendredi 20 février 2004
Statut
Membre
Dernière intervention
7 juillet 2006

yes ok, merci pour l'info

et pour mon -32767 de getasynckeystate, c'est bien pour l'antirebond?
parceque sinon, la valeur est -32768, bref des qu'on est sous 0 c'est que la touche est pressée

apres, pour getkeystate, les valeurs que j'ai constaté sont -128 et -127. C'est le même principe?

connaitrais tu les différentes valeurs possibles en retour de ces fonctions et leur significations?

parce que pour numlock par exemple, d'apres ce que j'ai compris :

-127/-128 -> on est en train d'actionner la touche
>0 -> la touche est au repos et inactive
0 -> la touche est au repos et active

ce serait bien quelque chose comme ca?

bon, je sais, faudrait que je lise la doc de microsoft :) désolé

etquand tu dis
"16 correspond à "Q" et 17 à "W" pour le système"
tu parles des valeurs en sortie directe du clavier?

il faudrait aussi que je me documente sur les protocoles des claviers :)

Merci encore
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
25
effectivement la touche ENTER n'a qu'un seul code,
je sais pas pourquoi, donc impossible de distinguer l'une de l'autre.
pour la touche Ctrl, on utilise 16 si on veut pas distinguer la droite de la gauche, sinon on utilise 162 ou 163

GetAsyncKeyState est surtout utilisé pour les jeux où il faut de la rapidité, réponse directe du clavier. sinon la touche reste dans le buffer virtuel tant qu'on ne l'a pas enlevée.

pour les ScanCodes, je suis pas sur que ce soit les mêmes,
ceux du système, de windows ou de vb ???
puisque 16 correspond à "Q" et 17 à "W" pour le système,
à vérifier ...

pour l'état des touches, ça dépend des touches:
If GetKeyState(VK_INSERT) = 1 Then
Text1 = "Touche INSERT activée"
Else
Text1 = "Touche INSERT non activée"
End If

If GetKeyState(VK_NUMLOCK) = 0 Then
Text1 = "Touche NUMLOCK activée"
Else
Text1 = "Touche NUMLOCK non activée"
End If
Afficher les 7 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.