Désactiver la touche NumLock - C++ - Programmation
Marsh Posté le 28-07-2004 à 11:47:23
Solution + facile : tu fais sauter la touche de ton clavier (ou des claviers des utilisateurs)
Et puis comment on peut appuyer sur la touche numlock par mégarde? A ce moment la on inverse pas un peu des chiffres non?
Marsh Posté le 28-07-2004 à 12:17:17
hop le fou a écrit : Solution + facile : tu fais sauter la touche de ton clavier (ou des claviers des utilisateurs) |
+1, surtout pour la seconde phrase....
J'ai peur que num lock soit géré à un encore plus bas niveau que les autres touches, par le contrôleur clavier directement. D'où le comportement que tu observes.
Marsh Posté le 28-07-2004 à 12:24:53
tu interceptes les évènements des touches de déplacement (NumLock désactivé) et tu renvoies les chiffres correspondants à la place
Marsh Posté le 28-07-2004 à 13:05:31
Masklinn a écrit : tu interceptes les évènements des touches de déplacement (NumLock désactivé) et tu renvoies les chiffres correspondants à la place |
bonne idée ... sauf que ces touches doivent servir aussi et rester accessible. Je ne sais pas faire la différence entre la "fleche gauche" du pavé de direction et celle du pavé numérique.
Code :
|
je me vois dejà dans le bureau de ces secrétaires avec mon tournevis ...
Code :
|
Trés facile : la touche est juste à coté du 7 du pavé. Quand ca se produit, les gens s'en rendent compte généralement car l'appuie sur une des touches de direction a un effet particulier : changer la valeur contenue dans le champ. Et ca écrase celle qu'on était en train de taper => utilisateur pas content.
Marsh Posté le 28-07-2004 à 13:07:05
demande un update des utilisateurs pour une version plus maline et regardant leurs écrans quand ils tapent alors, c'est la seule solution viable
Marsh Posté le 28-07-2004 à 13:11:35
Ha oui, j'ai essayé aussi de récupérer l'etat de verouillage du pavé numérique et émuler l'appuie supplémentaire sur numlock lorsqu'on appuie manuellement dessus (2 numlock au lieu d'un).
Visiblement, ca chie : j'obtient un booleen m'indiquant visiblement l'état de la diode du numlock du clavier. Or cette diode ne correspond pas reellement au verrouillage du pavé ... => ca tombe à l'eau.
Code :
|
Et moi j'ai peur que tu ais raison....
Marsh Posté le 28-07-2004 à 13:13:26
ou alors tu remplaces tous tes claviers par des claviers avec une touche num lock plus éloignée du numpad
Marsh Posté le 28-07-2004 à 13:38:39
oliv5 a écrit : Et moi j'ai peur que tu ais raison.... |
Si tu es capable d'intercepter le moment ou quelqu'un appuie sur numlock, il suffit de simuler le second appui sur la touche un peu plus tard, indépendamment du booléen qui t'indique l'état de la led du clavier. Il faut cependant que le clavier soit dans le bon mode des le début...
Marsh Posté le 28-07-2004 à 13:39:59
Ou alors, puisque tu es aussi capable d'intercepter toutes les autres touches, pourquoi ne pas intercepter toutes les touches du pavé numérique et simuler l'appui sur les touches numériques en fonction?
Par exemple si j'appuie sur la touche origine du pavé numérique ca simule l'appui sur la touche 7...
Marsh Posté le 28-07-2004 à 16:24:15
Ace17 a écrit : Si tu es capable d'intercepter le moment ou quelqu'un appuie sur numlock, il suffit de simuler le second appui sur la touche un peu plus tard, indépendamment du booléen qui t'indique l'état de la led du clavier. Il faut cependant que le clavier soit dans le bon mode des le début... |
Pas con, je vais essayer ca. Dire que ca m'est pas venu a l'esprit ...
Citation : Ou alors, puisque tu es aussi capable d'intercepter toutes les autres touches, pourquoi ne pas intercepter toutes les touches du pavé numérique et simuler l'appui sur les touches numériques en fonction? |
En fait, on récupère le numéro de la touche virtuelle qui vient d'etre préssée : le 7 du pavé numérique génèrera donc VK_NUMPAD7 si le pavé est verouillé sur On, sinon tu obtiendras VK_HOME.
Dans le meme ordre d'esprit, les touches 2,4,6,8 (fleches) renvoient soit VK_NUMPADX (X=numero touche) soit VK_LEFT,VK_RIGH,VK_UP,VK_DOWN (dans le désordre ), selon l'état du verouillage du pavé numérique.
Tu vois ? (pas simple de me comprendre en me relisant )
Par ex, je peux intercepter VK_LEFT : je ne sais pas si c'est le 4 du pavé numérique ou la touche de direction gauche. Comme la detection de l'etat du pavé numérique chie, bein heuuu... je ne sais pas quoi faire ...
Marsh Posté le 28-07-2004 à 16:28:05
Masklinn a écrit : demande un update des utilisateurs pour une version plus maline et regardant leurs écrans quand ils tapent alors, c'est la seule solution viable |
Je voudrais bien, mais bon, ca coute cher cette nouvelle version.
Remarques, je fais ca pour rendre service, car le principe du programme m'interesse. Si j'y arrive pas, bein, ils continueront comme avant. Ya jamais eu mort d'homme à cause de ce pb, juste de petits/gros chiffres erronés
(mais étant stagiaire, bientot à la recherche d'un boulot, si je peux rendre service et me faire bien voir par la meme occasion ... )
Marsh Posté le 28-07-2004 à 16:33:01
à chaque pression de touche, si numlock = off tu mets numlock = on, je ne vois pas trop le problème (c'est super simple à faire en Delphi en tout cas ; j'avais fait un soft qui compte le nombre de fois que chaque touche est appuyée et le numlock est intercepté comme toutes les autres, sauf la touche PrintScreen, je ne sais pas pourquoi)
j'essaierai ce soir de voir si ça marche à partir du code que j'ai déjà
Marsh Posté le 28-07-2004 à 16:40:38
(rummm .... )
Vilain antp qui n'a pas lu le post
Je n'arrive pas obtenir l'information numlock=on/off. Car ca marche la première fois, mais aprés avoir simulé l'appuis sur la touche (numlock) la première fois, ca ne marche plus correctement.
J'utilise les fonctions GetKeyState et GetAsyncKeyState, les 2 me posent le meme pb.
Sinon, je suis d'accord, c'est trés con à la base, c'est pour ca que j'essaie de le faire, pour rendre service rapido. (sauf que c'est moins rapido que ce que je croyais)
Marsh Posté le 28-07-2004 à 16:48:46
oliv5 a écrit : |
bah si, j'ai lu, mais je ne vois pas trop le problème : j'avais fait des essais avec le capslock en fait et ça marchait bien ; donc j'imagine que numlock c'est pareil
Marsh Posté le 28-07-2004 à 17:04:06
antp a écrit : bah si, j'ai lu, mais je ne vois pas trop le problème : j'avais fait des essais avec le capslock en fait et ça marchait bien ; donc j'imagine que numlock c'est pareil |
Bah dsl alors
Bein, ayant aussi deja fait un soft qui capturait le clavier, j'ai moi aussi cru que ce serait facile.
Bon, je reessairais ce soir.
Marsh Posté le 28-07-2004 à 18:07:31
http://www.bytegems.com/ihatethiskeydeluxe.shtml
http://www.phord.com/keyblock.html
y a des petits softs pas chers qui font ça, c'est peut-être la solution la plus simple
Marsh Posté le 28-07-2004 à 19:57:21
Cool !!!
Merci antp!
EDIT : doh !! ya pas de sources ...
Le pb, c'est que je vais pas imposer l'achat d'un de ces progs, meme si ca coute rien.
Marsh Posté le 29-07-2004 à 13:29:57
ouais bon ben j'ai trouvé la source de mes pbs.
En remplacant GetAsyncKeyState par GetKeyState (ces 2 fonctions renvoient l'état d'une touche, mais ne le font pas au meme moment), j'arrive a detecter le vrai état de Numlock => ca me permet de simuler un appuis suplémentaire sur cette meme touche si le pavé numérique était verrouilé.
Marsh Posté le 29-07-2004 à 13:40:05
oliv5 a écrit : |
J'ai pas cherché longtemps ; il y avait peut-être des softs gratuits aussi
Marsh Posté le 28-07-2004 à 11:27:28
Salut à tous.
Certaines personnes au boulot ont un pb : elles doivent saisir rapidement des tonnes de chiffres dans des formulaires et utilisent donc a fond le pavé numérique. Or, il arrive qu'elles appuient par mégarde sur la touche NumLock => passage en mode touche de direction. La fleche vers le haut rapelle la dernière valeur entrée, la flèche vers le bas propose une nouvelle valeur de manière à peu prés intelligente, etc etc
Ce qui fait qu'un appuie non volontaire sur Numlock a des conséquences sur les données saisies. Comme ca va trés vite, on se retrouve au final avec de la merde dans la bdd qu'il y a derrière ...
Je veux donc vérrouiller le clavier en mode NUMLOCK.
Je ne peux pas modifier le programme de saisie, j'essaie donc de faire un autre soft qui désactive le changement de mode NumLock/pas NumLock, de manière globale dans Windows.
J'ai essayé de poser un "hook" de bas niveau sur le clavier afin d'intercepter l'appuie sur la touche et ne rien renvoyer. Ca fonctionne parfaitement avec toutes les touches sauf .... avec NumLock.
(fonction SendInput, SetLowLevelKeyboardHook de l'api Win32)
Quand NumLock est intercepté, la diode ne change pas d'état (ca c'est ok) mais l'etat réèl du pavé numérique a changé : on continue de le verouiller/déverrouiller...
Comment peux-ton faire pour reellement y arriver ? Y a t-il plus simple que les hooks bas niveau ?
OS : Win2k
Langage : MFC, Api Win32