Dyrk.org
Do You Really Know

[Arduino] Emuler des caractères qui ne sont pas gérés par l’objet « Keyboard »

Publié le 29 novembre 2016 par #Ro0t

csm_m11x_tast_bel_02_54447ec5d4

 

 

Salut à tous,

 

Pour faire suite à la demande d’un lecteur (ZStof), qui me demandait après avoir réalisé  un nombre incalculable de tentatives … comment faire pour exploiter le caractère ‘\’ en AZERTY ….

Attention, tous les Arduino n’émulent pas le clavier.

Dont voici le détail …

 

sans-titre

 

Alors oui … on voit qu’il n’a pas baissé facilement les bras …
Aussi, et vu que c’est du Windows, je viens avec cette article, vous apporter une solution assez simple,  exploitant le presse-papiers !

Nous irons donc utiliser la table des caractèrescharmap.exe’

 

capture

 

Pour faire simple :

Nous allons simuler le comportement d’un utilisateur, en ouvrant cette fameuse fenêtre.
Ensuite, via quelques tabulations et en utilisant de manière intensive les flèches directionnelles nous allons nous positionner sur le caractère de notre choix, le sélectionner, puis le stocker dans le presse-papiers … via le bouton « copier » (toujours à l’aide des tabulations)

 

J’ai réalisé un petit proof of concept dans un code en VBScript 

[pastacode lang= »haml » manual= »%09%0A’%09%09%09%09Dyrk.org%0A’%09Copier%20le%20caract%C3%A8re%20’%5C’%20dans%20le%20presse%20papier%0A’%09%09%09%09%09P.O.C%0A’%0A’%0ASet%20oShell%20%3D%20WScript.CreateObject%20(%22WScript.Shell%22)%0A’%20On%20ouvre%20ici%20la%20table%20des%20caract%C3%A8res%0AoShell.run%20%22charmap.exe%22%0AoShell.AppActivate%20%22Table%20de%20caract%C3%A8re%22%0AWScript.Sleep%20250%0A%0A’%20On%20positionne%20notre%20curseur%20sur%20le%20tableaux%20des%20caract%C3%A8res%0AoShell.SendKeys%20%22%7BTAB%7D%7BTAB%7D%22%0A%0A’%20Pour%20la%20plupart%20des%20%22polices%22%20le%20caract%C3%A8re%20’%5C’%20se%20trouvera%20sur%20la%20deuxi%C3%A8me%20lignes%20%C3%A0%20la%2019%C3%A8me%20colonnes%0ALignes%20%20%3D%202%0AColones%20%3D%2019%0A%0A’%20Nous%20utilisons%20donc%20les%20fl%C3%A8ches%20du%20clavier%20pour%20nous%20rendre%20au%20bon%20endroit%0A’fleche%20%20droite%20%20%2019%20fois%0AFor%20i%20%3D%201%20To%20Colones%0A%09oShell.SendKeys%20%22%7BRIGHT%7D%22%0ANext%20%0A’fleche%20du%20bas%202%20fois%0AFor%20i%20%3D%201%20To%20Lignes%0A%09oShell.SendKeys%20%22%7BDOWN%7D%22%0ANext%20%0A%0A’%20Ici%20Nous%20allons%20validons%20le%20caract%C3%A8re%20avec%20la%20touche%20entr%C3%A9e%0AoShell.SendKeys%20%22%7BENTER%7D%22%0A%0A’%20Puis%20nous%20allons%20sur%20le%20bouton%20copier%0AoShell.SendKeys%20%22%7BTAB%7D%7BTAB%7D%7BTAB%7D%7BENTER%7D%22%0A%0A’%20Et%20nous%20fermons%20la%20fen%C3%AAtre%20avec%20un%20Alt%2BF4%0AoShell.SendKeys%20%22%25%7BF4%7D%22%0A » message= » » highlight= » » provider= »manual »/]

 

Donc comme pour votre Arduino, vous devrez exécuter « charmap.exe »

Pour ouvrir le menu démarrer avec un Arduino (ou sans ;) ), il faut simuler la touche « CTRL » + « ECHAP » (simultanément bien sur)
Vous pourrez ensuite saisir « charmap.exe » et valider avec la touche « entrée« .

Voilà nous sommes dans notre fameux :

 

capture

 

Ensuite, il faudra 2 fois simuler la touche « tabulation »
Notre curseur sera alors positionné sur la tableau, et il nous faudra nous déplacer avec les touches directionnelles …

En l’occurrence pour le « \« , il faudra simuler  19 fois un appui sur la flèche « droite« , et 2 fois sur la flèche du « bas » …

capture

 

Pour sélectionner le caractère « \« , il faudra simuler la touche « entrée »
Puis simuler 2 fois la toucher tabulation et « entrée » pour cliquer sur le bouton « copier »

 

capture

 

Et fermer avec un Alt+F4

Pour l’Arduino, j’ai codé un petit bout de code, qui vous permettra via les coordonnées dans le tableau, (19, 2 pour le « \« )  de copier un caractère dans le presse-papiers

 

[pastacode lang= »c » manual= »%2F%2FAppuie%20d’une%20touche%20%2B%20relachement%20juste%20apr%C3%A8s%0Avoid%20JustOncePressKey(int%20key)%7B%0A%09%20%20Keyboard.press(key)%3B%20%0A%09%20%20delay(100)%3B%0A%09%20%20Keyboard.releaseAll()%3B%0A%7D%0A%0Avoid%20getCharFromWindowsCharTab(int%20cols%2C%20int%20row)%7B%20%20%0A%09int%20i%20%3D%200%3B%0A%09%2F%2Fouverture%20de%20la%20table%20de%20caractere%20Windows%0A%09Keyboard.press(KEY_LEFT_CTRL)%3B%0A%09Keyboard.press(KEY_ESC)%3B%0A%09delay(100)%3B%0A%09Keyboard.releaseAll()%3B%0A%09delay(1000)%3B%0A%09Keyboard.println(%22charmap.exe%22)%3B%0A%09delay(250)%3B%0A%09%2F%2F%20Double%20Tab%0A%09while%20(i%2B%2B%20%3C%3D%201)%7B%20%20%20%20%20%20%20%20%20JustOncePressKey(KEY_TAB)%3B%20%7D%20%0A%09i%20%3D%200%3B%0A%09%2F%2FDeplacement%20dans%20le%20tableau%0A%09while%20(i%2B%2B%20%3C%3D%20(cols-1))%20%7B%20JustOncePressKey(KEY_LEFT_ARROW)%3B%20%20%7D%0A%09i%20%3D%200%3B%0A%09while%20(i%2B%2B%20%3C%3D%20(row-1))%20%7B%20%20JustOncePressKey(KEY_DOWN_ARROW)%3B%20%7D%0A%09%2F%2FSelection%20du%20caractere%20-%20touche%20entree%0A%09Keyboard.println(%22%22)%3B%0A%09%2F%2FTriple%20Tab%0A%09i%20%3D%200%3B%0A%09while%20(i%2B%2B%20%3C%3D%202)%7B%20%20%20%20%20%20%20%20%20%20JustOncePressKey(KEY_TAB)%3B%20%20%20%20%20%7D%0A%09%2F%2Ftouche%20entree%0A%09Keyboard.println(%22%22)%3B%0A%09%2F%2FFermeture%20Alt%2BF4%0A%09Keyboard.press(KEY_LEFT_ALT)%3B%0A%09Keyboard.press(KEY_F4)%3B%0A%09delay(100)%3B%0A%09Keyboard.releaseAll()%3B%0A%7D » message= » » highlight= » » provider= »manual »/]

 

Par exemple, pour copier « \ » dans le presse papier

 getCharFromWindowsCharTab(19,2);

 

Pour les fous furieux du C, j’ai développé une simulation « console » de ce qui se passerait :
new-project-20161129-tar

 

Conclusion

Vous allez pouvoir avec cette méthode utiliser tous les caractères spéciaux sous windows.