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

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ères 'charmap.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 

	
'				Dyrk.org
'	Copier le caractère '\' dans le presse papier
'					P.O.C
'
'
Set oShell = WScript.CreateObject ("WScript.Shell")
' On ouvre ici la table des caractères
oShell.run "charmap.exe"
oShell.AppActivate "Table de caractère"
WScript.Sleep 250

' On positionne notre curseur sur le tableaux des caractères
oShell.SendKeys "{TAB}{TAB}"

' Pour la plupart des "polices" le caractère '\' se trouvera sur la deuxième lignes à la 19ème colonnes
Lignes  = 2
Colones = 19

' Nous utilisons donc les flèches du clavier pour nous rendre au bon endroit
'fleche  droite   19 fois
For i = 1 To Colones
	oShell.SendKeys "{RIGHT}"
Next 
'fleche du bas 2 fois
For i = 1 To Lignes
	oShell.SendKeys "{DOWN}"
Next 

' Ici Nous allons validons le caractère avec la touche entrée
oShell.SendKeys "{ENTER}"

' Puis nous allons sur le bouton copier
oShell.SendKeys "{TAB}{TAB}{TAB}{ENTER}"

' Et nous fermons la fenêtre avec un Alt+F4
oShell.SendKeys "%{F4}"

 

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

 

//Appuie d'une touche + relachement juste après
void JustOncePressKey(int key){
	  Keyboard.press(key); 
	  delay(100);
	  Keyboard.releaseAll();
}

void getCharFromWindowsCharTab(int cols, int row){  
	int i = 0;
	//ouverture de la table de caractere Windows
	Keyboard.press(KEY_LEFT_CTRL);
	Keyboard.press(KEY_ESC);
	delay(100);
	Keyboard.releaseAll();
	delay(1000);
	Keyboard.println("charmap.exe");
	delay(250);
	// Double Tab
	while (i++ <= 1){         JustOncePressKey(KEY_TAB); } 
	i = 0;
	//Deplacement dans le tableau
	while (i++ <= (cols-1)) { JustOncePressKey(KEY_LEFT_ARROW);  }
	i = 0;
	while (i++ <= (row-1)) {  JustOncePressKey(KEY_DOWN_ARROW); }
	//Selection du caractere - touche entree
	Keyboard.println("");
	//Triple Tab
	i = 0;
	while (i++ <= 2){          JustOncePressKey(KEY_TAB);     }
	//touche entree
	Keyboard.println("");
	//Fermeture Alt+F4
	Keyboard.press(KEY_LEFT_ALT);
	Keyboard.press(KEY_F4);
	delay(100);
	Keyboard.releaseAll();
}

 

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.

Partagez ce contenu

Laisser une réponse

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *