Discussions au sujet de NI LabVIEW

annuler
Affichage des résultats de 
Rechercher plutôt 
Vouliez-vous dire : 

Comment désactiver certaines touches du clavier ?

Résolu !
Accéder à la solution

Bonjour,

 

J'utilise pour mon application une structure d'évènement qui gère l'appui des touches du clavier. Jusqu'ici tout fonctionne bien je ne rencontre pas de problème pour reconnaître les touches enfoncées, seulement j'aimerais que cette structure d'évènement ne prenne en compte que certaines touches du clavier. Pour le moment, ma structure génère un évènement quelle que soit la touche enfoncée. Je n'utilisais que des évènements statiques.

 

Après quelques recherches il semblerait qu'en utilisant des évènements dynamiques il soit possible de ne pas générer d'évènement sous certaines conditions. Je me suis donc penché là-dessus, et pour le moment tout ce que j'arrive à faire, c'est désactiver tous les évènements de type entrées au clavier dès que j'appuie sur une mauvaise touche.

 

Je vous joints un exemple, je pense que ce sera plus parlant, je suis débutant n'hésitez pas à faire la moindre remarque, ça me sera utile 😉

 

Dans cet exemple je génère simplement des évènements en enfonçant les touches de mon clavier. J'aimerais que seules les touches 1, 2 et 3 du clavier numérique (correspondant respectivement en code balayage à 79,80 et 81) génèrent des évènements. C'est pourquoi j'ai ajouté la génération de nombre aléatoire, idéalement il faudrait qu'aucun nombre ne soit généré lorsque j'appuie sur une autre touche que les 3 touches qui m'intéressent, et même que la led "Autre" reste éteinte.

 

Si jamais ce n'est pas possible je me suis demandé s'il n'était pas possible de désactiver tout simplement certaines touches du clavier, puis de les réactiver ensuite à la fin du VI, mais je n'ai pas trouver de piste pour le moment.

 

J'utilise LabView 2015 sur Windows 8.1.

 

Merci d'avance !

0 Compliments
Message 1 sur 26
7 296 Visites

J'avoue avoir lu ta question "en diagonale" et n'avoir regardé ton code que 30 sec

(je passe 1min par mon PC, mais je n'ai pas trop le temps, toutes mes excuses)

 

mais ceci pourrait-il t'aider ?

 

avec ce code, la lettre "a" n'est plus prise en compte.

Le code intercepte tout appui d'une touche clavier, vérifie q'il s'agit de la lettre "a", et si oui, efface l'action.

 

 

yyyyyy.png

0 Compliments
Message 2 sur 26
7 277 Visites

Ce qui est cool avec les Dynamic Events c'est que tu pourrais, sous certaines conditions, armer/désarmer ton événement. Par exemple, un bouton d'ascenceur, une fois qu'il est appuyé, il est inutile de porter attention au bouton jusqu'à ce que l'ascenceur ait été disponible à l'étage demandé. Donc tu pourrais annuler l'événement associé au bouton d'ascenceur pour éviter d'exécuter le code inutilement... Il y a sans doute de meilleures exemples.

 

 

Dans ton cas je pense qu'en tout temps, tu veux que les touches 1,2,3 génère l'événement, donc il est inutile de la désarmer puisqu'il faut toujours vérifier quelle touche a été appuyé avant de décider si on annule la frappe ou pas.

 

J'ai modifié ton code pour utiliser l'événement statique et il est p-ê mieux de vérifier le caractère plutot que le code clavier puisque le même caractère peut être donné par le pavé numérique ou régulier.

keydown.png

0 Compliments
Message 3 sur 26
7 263 Visites

Bonjour,

 

Tout d'abord merci pour vos réponses rapides !

 

J'avais essayé d'utiliser le Discard pour "filtrer" mes évènements, mais lorsqu'on appuie sur une touche autre que 1,2 et 3, cela entraîne tout de même une itération de la boucle While et donc génère un nouveau nombre aléatoire (et donc je me suis demandé à quoi servait ce filtre s'il ne filtrait pas). Je me suis dit que c'était le filtrage lui-même qui entraînait l'itération de la boucle, et que donc il fallait filtrer en amont, c'est pourquoi je me suis tourné vers les évènements dynamiques (apparemment c'est super pratique mais je ne suis toujours pas convaincu que ça puisse m'aider à résoudre mon problème).

 

Sinon j'avoue ne pas avoir très bien compris ton exemple de l'ascenceur 1abvi3w, mais en tout cas merci pour le conseil sur l'utilisation des Char plutôt que des ScanCode, je modifie mes VI's de suite !

0 Compliments
Message 4 sur 26
7 246 Visites

quand veux-tu exactement que ton nombre aléatoire soit généré ?

 

uniquement quand tu appuies sur 1, 2 ou 3 ?  "si oui" ... place la génération de ce nombre aléatoire dans la structure case.

 

tout code qui ne doit s'exécuter qu'à l'appui d'une de ces touches 1, 2 ou 3 doit se trouver à l'intérieur de cette structure case.

 

Bien sur que l'appui d'une touche clavier provoquera une itération de la While ... par définition de l'Event "key down".

 

C'est justement cette itération qui permet à LV de "traiter" ce key-down ... de "laisser passer" ou d'annuler l'action.

0 Compliments
Message 5 sur 26
7 238 Visites

J'aimerais éviter cette solution qui fonctionne dans le cas présent, mais qui rendra vite mes VI's illisibles. C'est la méthode que j'utilisais au début mais ma structure d'évènement gère maintenant plusieurs sous-VI's qui fonctionnent sur des appuis de touches (qui peuvent être différents ou identiques selon les VI's), et chacun de ces sous-VI's nécessitent un Shift Register et plusieurs paramètres d'entrée.

 

Donc si je calle tout ça dans la structure d'évènement je ne suis pas sûr de m'y retrouver ^^' et j'ai peur que cela engendre des conflits entre les sous-VI's qui utilisent les mêmes touches. C'est pourquoi si je pouvais désactiver certaines touches du clavier au lancement d'un sous-VI qui se trouverait à l'extérieur de la structure d'évènement pour que le sous-VI ne s'exécute que lorsque les bonnes touches sont enfoncées ça serait l'idéal.

 

Je ne pense pas réussir à être plus clair que ça, bien que je sois conscient que ce soit confus je m'en excuse Smiley gêné

 

En fait juste savoir comment désactiver une touche du clavier et la réactiver ensuite, ou faire en sorte que l'appui d'une mauvaise touche n'entraîne pas d'itération sur la boucle While, m'aiderait à me décoincer. J'espérais en même temps apprendre à me servir des évènements dynamiques pour pouvoir contrôler parfaitement mes évènements.

0 Compliments
Message 6 sur 26
7 216 Visites
Solution
Accepté par l'auteur du sujet Bastien_Rault

Comme expliquer par les autres, il n'est pas possible de discriminer les touches du clavier comme tu le souhaites.


Le plus abouti reste la solution que l'on t'a proposé, de faire un cas en fonction du code ascii de la touche utilisé pour "filtrer" dans un second temps.


Mais tu ne pourras pas empecher ta boucle "while" de faire une itération.

Si comme tu le signales, cette méthode engendre des risques de confusion dans ton programme, c'est peut être que tu n'es pas parti de la bonne structure de programme dès le départ.

 

En me basant sur ton dernier poste, j'aurais tendance à te conseiller l'utilisation d'une structure Producteur/Consommateur.
Ainsi ta boucle principale (productrice) va gérer les évènements utilisateurs en fonction des appuis clavier, et la boucle secondaire (consommateur) va faire le boulot demandé.

Ainsi tu n'aurais d'incrémenter de ta boucle consommatrice que lorsque que tu réalises vraiment un travail.

 

Bon courage.

“En science, la phrase la plus excitante que l'on peut entendre, celle qui annonce des nouvelles découvertes, ce n'est pas "Eureka" mais c'est "drôle"
Isaac ASIMOV
0 Compliments
Message 7 sur 26
7 207 Visites

C'était ma dernière solution, changer de structure. J'espérais ne pas à en arriver là Smiley triste

 

Pas le choix je m'y colle alors, merci beaucoup pour toutes vos réponses.

0 Compliments
Message 8 sur 26
7 205 Visites

juste pour le plaisir, je vais essayer une autre solution. (histoire de faire une pirouette  Smiley heureux )

 

soit passer par une fonction de l'API Windows pour désactiver le clavier (le réactiver ensuite) ... bof, j'aime pas trop.

 

mais je pense avoir une meilleure idée, utiliser une ligne d'event dynamique ...

 

pas pour l'event dynamique en lui-même, mais pour avoir accès à la fonction "flush queue" (qui permet de vider "aussi" les event statiques.)

 

ce qui me permettrait en "sortie" de sous-VI de vider globalement la queue des "event key down" survenus pendant l'exécution du sous-VI. (je l'espère)

 

(pas le temps de suite, je m'y colle ce soir)

 

Ceci dit ... la solution de Michael est peut-être (probablement) une bonne solution.

 

0 Compliments
Message 9 sur 26
7 192 Visites

Probable que la réponse de Michael soit complète, toutefois je note une petite déception dans ton dernier commentaire.

 

Peut-être que la notion de Boucles Producer/Consumer est lourde à intégrer dans ton code existant, avec Queue ou autre?

 

Je te suggère juste d'utiliser les UserEvent, peut-être ça facilitera ton travail? Je ne sais pas, en tout cas voici comment je pense que tu espères pouvoir le réaliser.

 

keydowndynamic.png

0 Compliments
Message 10 sur 26
7 174 Visites