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

Etat du clavier

2 réponses
Avatar
Gloops
Bonjour tout le monde,

Je cherche =E0 r=E9aliser une interface pour afficher l'=E9tat de mon cla=
vier=20
: verrouillage des majuscules, du pav=E9 num=E9rique, du d=E9filement, in=
sertion.

Pour les deux premiers c'est vrai que l'int=E9r=EAt est un peu limit=E9=20
puisque les LED sur le clavier fournissent le renseignement, en revanche =

la LED du verrouillage de d=E9filement fournit, sur mon clavier, une=20
information fausse (correspondant =E0 la bascule op=E9r=E9e par Fn F10, a=
lors=20
que le verrouillage de d=E9filement s'obtient par Fn F12, et j'ignore =E0=
=20
quoi correspond Fn 10 -oui je sais je vais regarder sur la notice). Au=20
demeurant l'=E9tat d'insertion est classiquement quelque chose qui=20
s'affiche dans une application.

J'ai d=E9clar=E9 dans mon formulaire les API GetKeyState et=20
GetKeyboardState, et je commen=E7ais =E0 tourner un peu ch=E8vre avec les=
=20
r=E9sultats assez impr=E9visibles que j'obtenais.

Au bout d'un moment, je me suis aper=E7u que Visual Studio affiche l'=E9t=
at=20
d'insertion du clavier, =E0 droite sur la barre d'=E9tat, ce qui m'a perm=
is=20
de prendre conscience que tant que je n'ai pas lanc=E9 mon application=20
tout va bien, la touche Ins fait alterner les affichages INS et OVR,=20
mais une fois que j'ai lanc=E9 l'application ou m=EAme simplement appel=E9=
=20
GetKeyboardState en le pr=E9fixant par Form1, c'est termin=E9, l'=E9tat=20
d'insertion du clavier tel que renseign=E9 sur la barre d'=E9tat semble=20
verrouill=E9.

Dans mon application, je r=E9ussis effectivement =E0 rendre compte de l'=E9=
tat=20
du verrouillage de d=E9filement, ce qui tombe bien puisque c'=E9tait=20
effectivement le but, mais j'aimerais bien comprendre comment il se fait =

que j'achoppe sur les autres points de l'=E9tat du clavier.

Le fait de lancer un formulaire .Net, est-ce que =E7a affecte les API qui=
=20
permettent d'interroger l'=E9tat du clavier ? Y a-t-il quelque chose =E0 =

faire pour que l'=E9tat soit rafraichi ?

J'ai travaill=E9 avec ces constantes, j'imagine que le probl=E8me ne se=20
situe pas l=E0 :
const int VK_SCROLL =3D 0x91;
const int VK_CAPITAL =3D 0x14;
const int VK_NUMLOCK =3D 0x90;
const int VK_INSERT =3D 0x2D;
const int VK_ATTN =3D 0xF6;

Bon et puis tant que j'y suis les API :
[DllImport("user32.dll")]
private static extern int GetKeyboardState(byte pbKeyState);

[DllImport("user32.dll")]
private static extern Int16 GetKeyState(int nVirtKey);

2 réponses

Avatar
Gloops
J'arrive au bout pour la plus grande partie.
Je lis l'état du clavier dans la procédure événementielle liée à la
pression d'une touche.
Lorsque je viens de presser une touche de changement d'état (Maj, Ver
num, ins ...), GetKeyState() pour la touche correspondante retourne
1111111100000001 si l'état est mis, 1111111100000000 sinon (dit
autrement, 0xFF01 ou 0xFF00).
Si j'ai pressé une autre touche, la fonction retourne 1 ou 0.
Il convient donc de récupérer le dernier bit comme j'en ai fait éta t
dans le fil suivant, et ça marche. Je dois dire que je ne l'avais pas
compris comme ça du premier coup, pourtant j'ai déjà joué avec ç a en VB6
(il y a quelques années il est vrai).

Seul le verrouillage du pavé numérique est encore un peu rétif, ave c le
même code pourtant. Comme le verrouillage numérique fonctionne puisqu e
je tape bien des chiffres avec le pavé numérique, je me demande si ç a ne
serait pas la constante VK_NUMLOCK qui serait fausse, j'ai
const int VK_NUMLOCK = 0x90;



_____________________________________
Gloops a écrit, le 12/11/2009 12:44 :
Bonjour tout le monde,

Je cherche à réaliser une interface pour afficher l'état de mon c lavier
: verrouillage des majuscules, du pavé numérique, du défilement, insertion.

Pour les deux premiers c'est vrai que l'intérêt est un peu limité
puisque les LED sur le clavier fournissent le renseignement, en revanch e
la LED du verrouillage de défilement fournit, sur mon clavier, une
information fausse (correspondant à la bascule opérée par Fn F10, alors
que le verrouillage de défilement s'obtient par Fn F12, et j'ignore à
quoi correspond Fn 10 -oui je sais je vais regarder sur la notice). Au
demeurant l'état d'insertion est classiquement quelque chose qui
s'affiche dans une application.

J'ai déclaré dans mon formulaire les API GetKeyState et
GetKeyboardState, et je commençais à tourner un peu chèvre avec l es
résultats assez imprévisibles que j'obtenais.

Au bout d'un moment, je me suis aperçu que Visual Studio affiche l'é tat
d'insertion du clavier, à droite sur la barre d'état, ce qui m'a pe rmis
de prendre conscience que tant que je n'ai pas lancé mon application
tout va bien, la touche Ins fait alterner les affichages INS et OVR,
mais une fois que j'ai lancé l'application ou même simplement appel é
GetKeyboardState en le préfixant par Form1, c'est terminé, l'état
d'insertion du clavier tel que renseigné sur la barre d'état semble
verrouillé.

Dans mon application, je réussis effectivement à rendre compte de l 'état
du verrouillage de défilement, ce qui tombe bien puisque c'était
effectivement le but, mais j'aimerais bien comprendre comment il se fai t
que j'achoppe sur les autres points de l'état du clavier.

Le fait de lancer un formulaire .Net, est-ce que ça affecte les API q ui
permettent d'interroger l'état du clavier ? Y a-t-il quelque chose à
faire pour que l'état soit rafraichi ?

J'ai travaillé avec ces constantes, j'imagine que le problème ne se
situe pas là :
const int VK_SCROLL = 0x91;
const int VK_CAPITAL = 0x14;
const int VK_NUMLOCK = 0x90;
const int VK_INSERT = 0x2D;
const int VK_ATTN = 0xF6;

Bon et puis tant que j'y suis les API :
[DllImport("user32.dll")]
private static extern int GetKeyboardState(byte pbKeyState);

[DllImport("user32.dll")]
private static extern Int16 GetKeyState(int nVirtKey);



Avatar
Gloops
Gloops a écrit, le 12/11/2009 17:14 :
Seul le verrouillage du pavé numérique est encore un peu rétif, a vec le
même code pourtant. Comme le verrouillage numérique fonctionne puis que
je tape bien des chiffres avec le pavé numérique, je me demande si ça ne
serait pas la constante VK_NUMLOCK qui serait fausse, j'ai
const int VK_NUMLOCK = 0x90;




En fait, je me rends compte que GetKeyState(VK_NUMLOCK) s'active en
pressant Fn F11, et se désactive en pressant Fn F10. Après avoir pres sé
Fn F11 on tape les chiffres, avec le pavé numérique qui se situe gros so
modo entre les lettres J et O (c'est un portable), et après avoir press é
Fn F10 on accède aux fonctions du pavé numérique déverrouillé, à savoir
les touches de déplacement de curseur.

Bon, il reste à faire mumuse avec les autres constantes VK pour savoir
laquelle va m'indiquer le deuxième état du pavé numérique, et lu i
affecter un code à l'affichage.

Et au passage, il faut que je fasse attention en jouant avec ça, parce
que Fn Espace change la résolution d'écran.

En début d'après-midi je ne me voyais pas si bien embarqué que ça .

Merci quand même à ceux qui ont pris le temps de lire le fil ...