Librairie Keyboard (utilisation, explication et conversion AZERTY)

Le code Keyboard_Azerty.ino est attaché a ce message
[Mise à jour, prend en charge certains caractères spéciaux directement V1.01]
[Mise à jour, amélioration du code V1.02]

Explication du fonctionnement de la librairie Keyboard

Nous allons étudier la façon dont la librairie keyboard fonctionne, son utilisation pour produire les caractères français ainsi que les problèmes de conversion.

Le clavier est un ensemble de touches, à chaque touche correspond un code 8 bits (scan code) qui n'est pas directement en rapport avec le caractère qui lui est assigné, c'est le système d'exploitation qui va mapper le scan code suivant le type de clavier qui est déclaré dans le système, il peut être d'ailleurs changé en passant par les paramètres. La touche a du clavier français AZERTY dont la disposition correspond à la valeur 'q' du clavier QWERTY a la valeur 0x14 en hexa soit 20 en décimal.

Pour voir l'ensemble des scan codes du clavier QWERTY, cliquer sur ce lien, l'image se trouve en bas de page:
par rapport au clavier AZERTY, l'emplacement de la touche 0x31 fait partie de la touche 'Entrée', par contre l'emplacement de la touche du scan code 0x32 sera pour nous le 0x31 et correspond à la touche '* et µ'.

Il existe un document PDF microsoft listant une correspondance HID USB et PS2 où l'on retrouve ces scan codes, suivre la colonne HID Usage ID :

La librairie Keyboard n'offre pas la possibilité directement de simuler les touches du clavier par leurs 'scan codes' mais offre une translation par l'alphabet à partir du clavier de référence qui est le QWERTY. On comprend tout de suite les problèmes que l'on va rencontrer, d'une part parce que l'emplacement des caractères n'est pas la même ou diffère demandant l'appui du shift pour la produire et d'autre part le nombre de caractère français est plus important et demande en plus de la commande shift, l'utilisation de la commande Alt Gr pour produire l'ensemble des caractères de notre clavier AZERTY.

Cependant, la lecture du code source de la librairie Keyboard.cpp nous permet de comprendre que l'on peut utiliser les scan codes en ajoutant la valeur 0x88 en hexa ou 136 en décimal.

Voici un exemple de code qui reproduit la frappe des 48 touches imprimables par les scan codes:

// ---------------------------------------------------
// nico78
// scancode keyboard qwerty et correspondance azerty
// ---------------------------------------------------
//  ' ' est le symbole qui désigne un espace, il a la valeur 44
//  Alt Gr azerty                   €                                                                    ~  #  {  [  |  `  \  ^  @    ' '  ]  }  ¤       
//   Shift azerty       Q  B  C  D  E  F  G  H  I  J  K  L  ?  N  O  P  A  R  S  T  U  V  Z  X  Y  W  1  2  3  4  5  6  7  8  9  0    ' '  °  +  ¨  £  µ  No fr  M  %  NONE  .  /  §    >
//         azerty       q  b  c  d  e  f  g  h  i  j  k  l  ,  n  o  p  a  r  s  t  u  v  z  x  y  w  &  é  "  '  (  -  è  _  ç  à    ' '  )  =  ^  $  *  No fr  m  ù   ²    ;  :  !    <
//         qwerty       a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z  1  2  3  4  5  6  7  8  9  0    ' '  -  =  [  ]  \  No US  ;  '   `    ,  .  /   No US      
//       scancode       4, 5, 6, 7, 8, 9, 10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,  44, 45,46,47,48,49,  50,  51,52, 53,  54,55,56,  100}; 

#include <Keyboard.h>

void setup() {

  // put your setup code here, to run once:
  
  Keyboard.begin();
  delay(5000);

  for (int c=4; c<40; c++){
    keyboardScanCode(c);
  }

  // 50 ou 0x32 n'est pas utilisé sur notre clavier
  for (int c=44; c<50; c++){
    keyboardScanCode(c);
  }

  for (int c=51; c<57; c++){
    keyboardScanCode(c);
  }

  // Scan code pour la touche '< et >'
  keyboardScanCode(100);
  
  Keyboard.end();
}

void loop() {
  // put your main code here, to run repeatedly:
}

void keyboardScanCode(byte code){
  Keyboard.press(code+136);
  delay(5);
  Keyboard.release(code+136);
}

Pour composer les caractères nécessitant l'appui de la touche shift ou Alt Gr, il faut le programmer tel qu'on le ferait à la main sur le clavier, en voici quelques exemples:

// ---------------------------------------------------
// nico78
// scancode keyboard qwerty et correspondance azerty
// ---------------------------------------------------
//  ' ' est le symbole qui désigne un espace, il a la valeur 44
//  Alt Gr azerty                   €                                                                    ~  #  {  [  |  `  \  ^  @    ' '  ]  }  ¤       
//   Shift azerty       Q  B  C  D  E  F  G  H  I  J  K  L  ?  N  O  P  A  R  S  T  U  V  Z  X  Y  W  1  2  3  4  5  6  7  8  9  0    ' '  °  +  ¨  £  µ  No fr  M  %  NONE  .  /  §    >
//         azerty       q  b  c  d  e  f  g  h  i  j  k  l  ,  n  o  p  a  r  s  t  u  v  z  x  y  w  &  é  "  '  (  -  è  _  ç  à    ' '  )  =  ^  $  *  No fr  m  ù   ²    ;  :  !    <
//         qwerty       a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z  1  2  3  4  5  6  7  8  9  0    ' '  -  =  [  ]  \  No US  ;  '   `    ,  .  /   No US      
//       scancode       4, 5, 6, 7, 8, 9, 10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,  44, 45,46,47,48,49,  50,  51,52, 53,  54,55,56,  100}; 

#include <Keyboard.h>

void setup() {
  // put your setup code here, to run once:
  
  Keyboard.begin();
  delay(5000);

  // Pour composer le A majuscule"
  Keyboard.press(KEY_LEFT_SHIFT);
  keyboardScanCode(20); // ou keyboard.print('q');
  Keyboard.release(KEY_LEFT_SHIFT);

  // Pour composer le caractère @
  // Alt Gr = Ctrl + Alt
  Keyboard.press(KEY_LEFT_CTRL);
  Keyboard.press(KEY_LEFT_ALT);
  keyboardScanCode(39); // ou keyboard.print('0');
  Keyboard.release(KEY_LEFT_ALT);
  Keyboard.release(KEY_LEFT_CTRL);  

  // Pour composer le caractère ê
  // nécessite deux séquences de touches, l'appui sur la touche ^ (0x2F)(dead key)
  // puis ensuite la touche e (0x08)
  keyboardScanCode(47);
  keyboardScanCode(8); // ou keyboard.print('e');

  
  Keyboard.end();
}

void loop() {
  // put your main code here, to run repeatedly:

}

void keyboardScanCode(byte code){
  Keyboard.press(code+136);
  delay(5);
  Keyboard.release(code+136);
}

Keyboard_French1-2.ino (20 KB)

Nous avons vu comment accéder aux touches du clavier, concernant les caractères imprimables; maintenant voyons comment utiliser les touches de commandes.

Le site Arduino les listent sur leur site, ils sont appelés 'Keyboard Modifiers', consultable ici:
https://www.arduino.cc/en/Reference/KeyboardModifiers

En fait si vous regardez bien, on comprend que les valeurs supérieures à 0x87 ne sont pas les valeurs réelles, il a été ajouté la valeur 0x88 à la valeur réelle comme nous l'avons vu précédemment. C'est le codage utilisé dans le fichier Keyboard.cpp qui l'impose.

Par exemple, la touche BackSpace (retour arrière) à la valeur réelle 0x2A hexa ou 42 en décimal, si on lui ajoute la valeur 0x88, on obtient 0xB2, soit bien la valeur déclarée dans les fichiers de la librairie.

Les valeurs allant de 0x80 à 0x87 ne sont pas non plus les valeurs réelles mais cela n'aura pas d'impact pour nous. On pourra utiliser toutes ces valeurs sans difficulté.

Réalisation d'un clavier:

Si l'on désire concevoir un clavier avec un montage arduino, choses que je n'ai pas réalisé, il faudra faire attention à l'utilisation des matrices qui ne permettent pas d'exploiter deux appuis sur deux touches en même temps. Il sera alors nécessaire de séparer certaines touches des autres dans la gestion du code comme les deads key ^ , ¨ , ~ , ` le shift et le Ctrl + Alt

Concernant le clavier numérique, on pourra aussi le simuler; encore une fois toutes les valeurs sont listées dans le document microsoft téléchargeable dans le premier post.

Ainsi le chiffre 1 du clavier numérique a le scan code 0x59, il faudra ajouter 0x88, ce qui donne 0xE1 en hexa ou 225 en décimal.

Ecrire du texte à la volée:

Pour écrire du texte à la volée, il faut soit modifier le code de la librairie soit créer un code de conversion.

Il existe une librairie KeyboardAzertyFr qui permet d'écrire une partie des caractères français disponible, on ne pourra pas écrire les caractères avec accents, les dead keys (combinaison de deux séquences de touche) et les caractères accessibles par Alt Gr; mais je pense qu'elle pourra suffire si l'on souhaite exécuter des scripts, le lien ici:

L'installation de cette librairie pourra sembler ne pas fonctionner, en fait ça dépendra si on a dèjà compiler ou pas le même code avant cette librairie. J'ai dû faire des suppressions à la main, je ne le met pas ici car je ne suis plus très sûr de ce que j'ai fais. De mémoire dans le dossier arduino de 'mes document's et dans les fichiers de compilation temporaires, le chemin s'affiche en bas lors de la compilation.

Pourquoi la conversion de tous les caractères français n'existent pas encore?

D'abord, elle existe maintenant puisque je l'ai moi-même réalisé mais ce n'est pas une librairie; c'est la raison pour laquelle je fais ce tuto. Le code de conversion sera disponible dans les prochains posts. J'aurais évidemment voulu contribué à la librairie KeyboardAzertyFr, mais mes connaissances en codage en c pure sont limités, de plus avec le problème des caractères que nous allons abordé, je ne voyais pas de solution simple à part utiliser des tableaux sur deux octets au lieu de 1 octet actuellement mais ça risque de consommer énormément de mémoire.

Le problème que j'ai rencontré, c'est que les chaînes de caractères sont codées en UTF-8, ainsi l'ensemble de nos caractères français ne tient pas sur un octet pour tous, il en faut parfois 2 (asccii supérieur à 127), voire trois pour le caractère €. Donc traité des caractères qui n'occupent pas le même espace devient nettement plus ardu pour une conversion et devient un problème pour modifier la librairie Keyboard. Aussi si vous utilisez des Teensyduino, et que vous avez installé l'exécutable qui met en place les fichiers, celui-ci supprime la librairie de son emplacement.

Cela dit, il faut savoir que sur le site d'Arduino, des codes de conversions UTF-8 ascii étendu existent, ce qui pourrait simplifier la création d'une nouvelle librairie au moins pour nous, à voir ici:
https://playground.arduino.cc/Main/Utf8ascii

J'ai donc entrepris la création d'une conversion qui je l'espère permettra aussi d'adapter le code à d'autres langages que le français.

Notification des leds du clavier (CAPS LOCK, NUM LOCK, SCROLL LOCK)
Comme vous le savez, lorsque vous appuyer sur Verr Maj (verrouillage des majuscules), une led s'affiche sur votre clavier et cela ne va pas seulement affecter votre clavier sur lequel la touche a été activée mais les autres périphériques claviers aussi. (l'emploi de plusieurs claviers ne posant pas de problème pour l'OS). Le système d'exploitation va notifier systématiquement les autres périphériques concernés de l'état de ces touches. Ainsi si Verr Maj est activé sur un clavier, l'autre sera automatiquement en verrouillage des majuscules, les miniscules se transformeront en majuscules etc...

Il devient alors nécessaire si on souhaite envoyer des chaînes de caractères de s'assurer notamment que la touche Verr Maj n'est pas activée, voire aussi pour NUM LOCK et SCROLL LOCK.

Par chance, sur le forum arduino, une personne a fourni l'ensemble des fichiers à remplacer. J'ai testé ces fichiers et cela a bien fonctionné.

Je vous donne le lien où j'ai puisé l'information:
https://forum.arduino.cc/index.php?topic=173583.15

En téléversant le code de conversion avec le test inclus, notepad va s'exécuter et tous les caractères du clavier vont s'afficher avec en plus l'exécution d'un copier-coller à la fin comme le montre le gif ci-dessous.

Héberge ton gif ailleurs que sur google.... là ça marche pas.

Mise à jour V1.01, correction et amélioration du code, voici la liste des fonctions:

// sendtext("abcd...") --> pour envoyer du texte (longueur maxi 254 caractères à la fois)
// sendtextln("abcd...") --> pareil avec retour chariot (longueur maxi 254 caractères à la fois)
// sendkeypad(0123456789/*-+E) pour simuler le clavier numérique, E pour la touche Entrée
// altunicode("0169"); 2 à 4 chiffres en argument pour afficher d'autres caractères unicodes dans les éditeurs qui les acceptent
// ÇÉÈ æ œ øØ ↨↑↓→←↔ ►◄▲▼ :relaxed::slight_smile: :heart::diamonds::clubs::spades: :male_sign::female_sign: ♪♫ ☼ “” ™©® --> caractères spéciaux que l'on peut utiliser directement (utilise altunicode automatiquement)
// sendkeycombi(KEY_LEFT_GUI, 'r') permet de taper deux touches en même temps (une touche system + une touche ascii), ici 'window + r'
// selectall() permet de sélectionner tout le texte
// cut() pour couper du texte
// copy() pour copier du texte
// paste() pour coller du texte
// homekey() pour déplacer le curseur vers le début du texte lors d'une sélection
// endkey() pour déplacer le curseur vers la fin du texte lors d'une sélection
// leftkey(nb) déplace le curseur vers la gauche (nb = nombre de fois)
// rightkey(nb) déplace le curseur vers la droite (nb = nombre de fois)
// upkey(nb) déplace le curseur vers le haut (nb = nombre de fois)
// downkey(nb) déplace le curseur vers le bas (nb = nombre de fois)
// tabkey(nb) permet de faire une tabulation (nb = nombre de fois)
// returnkey(nb) permet de revenir à la ligne (nb = nombre de fois)
// backspacekey(nb) touche Retour Arrière du clavier (nb = nombre de fois)
// deletekey(nb) touche Suppr du clavier (nb = nombre de fois)
// sendkeycommand(command) permet d'envoyer des commandes qui ne sont pas utiliser dans les fonctions précédentes comme
// KEY_ESC , KEY_INSERT , KEY_PAGE_UP , KEY_PAGE_DOWN , KEY_CAPS_LOCK

Super post qui est très intéressant pour mon projet actuel... même si a 90% mon projet fonctionne comme je voudrais, je bute toujours sur un problème, émuler la touche espace, qui correspond à u raccourci clavier dans un logiciel que j'utilise, et que je ne peu pas modifier .....si tu as une piste que je pourrais suivre je te remercie d'avance !

Donc si je comprend bien, la touche elle même pour faire un espace ne fonctionne pas dans ton cas, il faut passer par un raccourci.

Quel est ce raccourci qu'il faut utiliser?
Est t'il possible d'effectuer des essais si tu donnes l'appli en question?

@nico78: je pense qu'il veut dire que la touche espace est, en elle-même, un raccourci clavier pour le logiciel.
Exemple: VLC (je ne sais pas si c'est ce logiciel que bengibbs utilise, ce n'est qu'un exemple...)
Avec VLC, la touche espace permet de mettre en lecture ou en pause un fichier audio ou vidéo. Ici, cette touche est donc un raccourci clavier.

La touche espace a la valeur 44 pour le scancode, comme il est commun et ne change pas, je l'ai traité comme une commande tel qu'une tabulation ou la touche entrée, je viens de le rajouter dans les exemples du premier post.

Il existe aussi l'espace insécable que l'on ne peut faire qu'en utilisant la touche alt (maintenue enfoncée) + 2 à 4 touches du pavé numériques), c'est un espace que l'on intercale entre deux mots (ou un mot et une ponctuation) qui ne doivent pas être séparés en fin de ligne.

Pour les claviers qui ne disposent pas du pavé numérique, il serait possible de le simuler avec la touche FN + Num Lock, vu ici :

Je rappelle que le fichier en pièce jointe du premier post a une fonction qui permet de simuler le 'Alt+Code'

Wikipédia (espace insécable): Espace insécable — Wikipédia

Wikipédia (Alt Codes): Combinaisons de touche Alt — Wikipédia

Infos supplémentaires ici: Utiliser correctement les espaces insécables (c'est pas si facile)

ce qui donne:
ALT 255 Code page 437 ou 850 ou
ALT 0160 Code page 1252 (commence toujours par 0)

On peut simuler la touche espace standard de plusieurs façons:

// En utilisant la commande standard
Keyboard.print(" ");

// par le scancode (on ajoute la valeur 136 comme vu plus haut)
// ( 0x2C (hexa) ou 44 (décimale) ) + 136 = 180
Keyboard.write(180);

// --- ou ---
// Keyboard.press(180)
// delay(5)
// Keyboard.release(180)

Mise à jour V1.02, amélioration du code, pas de nouveauté ajouté.

N'hésiter pas à me faire remonter vos essais que ceux-ci fonctionnent bien ou pas.

@nico78 Merci de ton travail ! Mais j'ai rien compris : Faut faire quoi pour pouvoir afficher les caractères spéciaux genre {[|`^@]} ? J'ai cru comprendre que cela avait un rapport avec des "dead keys" mais je suis grave perdu la... J'utilise un clavier français avec la librairie de github : GitHub - martin-leo/KeyboardAzertyFr
0Mais je n'ai toujours pas réussi à afficher les caractères spéciaux...
Bref déso si je comprends rien mais merci d'avance pour votre aide

Bonjour,

Eh bien, c'est parce que le code est prévu pour fonctionner avec la lib "Keyboard.h>" d'arduino, la lib originale, elle n'est pas prévu pour fonctionner avec une autre lib.

Je comprends que vous souhaitez peut être seulement utiliser les codes ASCII de base et les adapter à la langue fr, effectivement dans le cas où l'on veut créer des scripts, c'est suffisant.

Je vais vous fournir un code beaucoup plus simple, un peu de patience je vais le poster dans la journée.

Le code qui va suivre est prévu pour fonctionner avec la lib Keyboard d'Arduino et ne fonctionnera sans doute pas si vous l'utiliser avec une autre Lib.

Si vous voulez qu'elle puisse fonctionner avec une autre lib, demander à l'auteur d'inclure et modifier le code ici présent.

De plus, si vous avez installé l'éxécutable Teensy loader pour les cartes de la familles Teensy, il faudra réinstallé l'IDE d'Arduino, car cet exe modifie certains fichiers lors de son installation et ne permettra pas d'exécuter ce code correctement (seulement parce qu'on utilise la lib keyboard, sinon il n'y a pas de problème avec les autres codes).

Voici le code, j'ai rajouté quelques fonctions que vous pourrez modifier ou même supprimer:

[UPDATE du 01/09/2019]

// nico78, le 03/08/2019
// modif le 14/08/2019
// Adaptation qwerty to azerty pour les caractères simples de la table ASCII afin d'exécuter des scripts.
// Prévu pour fonctionner avec la librairie Keyboard originale de l'arduino
// donc ne soyez pas surpris si cela ne fonctionne pas avec une autre lib.
// Si vous avez installé le Teensy Loader, il faudra réinstallé l'exécutable arduino
// Liste des clés spéciales ici: https://www.arduino.cc/en/Reference/KeyboardModifiers

#include <Keyboard.h>

String AltGrazerty="~#{[|`\\^@#]}";
String shiftazerty="QBCDEFGHIJKL?NOPARSTUVZXYW1234567890 Q+QQQQM%Q./Q>";
String azerty="qbcdefghijkl,noparstuvzxyw&q\"'(-q_qq )=q$q*mqq;:!<";
const byte scancode[] = {4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,44,45,46,47,48,49,50,51,52,53,54,55,56,100}; 

// Modifier la tempo si c'est trop rapide ou bien trop lent
// cette tempo sert pour
const int tempo=500;
 
void Keyfr(const String &Texte){
  int j = -1;
  
  for (unsigned int i=0; i< Texte.length(); i++){
    char c = Texte.charAt(i);

    if (c=='\t'){
      Keyboard.write(KEY_TAB);
    }
    
    int index = azerty.indexOf(c);
    if (index>-1){
      j = scancode[index]+136;
      Keyboard.write(j);
    } else{
      index = shiftazerty.indexOf(c);
      if (index>-1){
        j = scancode[index]+136;
        Keyboard.press(KEY_LEFT_SHIFT);
        Keyboard.press(j);
        Keyboard.releaseAll();
      }else {
        index = AltGrazerty.indexOf(c);
        if (index>-1){
          j = scancode[index+27]+136;
          Keyboard.press(KEY_LEFT_CTRL);
          Keyboard.press(KEY_LEFT_ALT);
          Keyboard.write(j);
          Keyboard.releaseAll();  
          if (index==0 || index==7){ 
            // Traitement spécial pour ce caractère ~ et ^ qui sont des deads keys
            // ce qui n'est pas le cas sur les clavier qwerty
            // on le tape une seconde fois puis on fait un Retour Arrière.
            Keyboard.press(KEY_LEFT_CTRL);
            Keyboard.press(KEY_LEFT_ALT);
            Keyboard.write(j);
            Keyboard.releaseAll(); 
            Keyboard.write(KEY_BACKSPACE);
          }
        }
      }   
    }
  }
}

void Keyfrln(const String &Texte){
  Keyfr(Texte);
  Keyboard.write(KEY_RETURN);
}

void Keycombi(byte key1, char key2){
  String keys;
  Keyboard.press(key1);
  if ((byte)key2<128){
    keys+=key2;
    Keyfr(keys);
  }else{
    Keyboard.press((byte)key2);
  }
  Keyboard.releaseAll();
  delay(tempo);
}

// Fonction pour personnaliser des commandes
// A modifier ou compléter
void Keyspecial(const String &Texte){
  if (Texte=="window+r"){
    Keycombi(KEY_LEFT_GUI, 'r');
  }else if (Texte=="copier"){
    Keycombi(KEY_LEFT_CTRL, 'c');
  }else if (Texte=="couper"){
    Keycombi(KEY_LEFT_CTRL, 'x');
  }else if (Texte=="coller"){
    Keycombi(KEY_LEFT_CTRL, 'v');
  }else if (Texte=="selectionner"){
    Keycombi(KEY_LEFT_CTRL, 'a');
  }else if (Texte=="annuler"){
    Keycombi(KEY_LEFT_CTRL, 'z');
  }else if (Texte=="rétablir"){
    Keycombi(KEY_LEFT_CTRL, 'y');
  }else if (Texte=="imprimer"){
    Keycombi(KEY_LEFT_CTRL, 'p');
  }else if (Texte=="fermer"){
    Keycombi(KEY_LEFT_ALT, KEY_F4);
  }else if (Texte=="menufermer"){
    Keycombi(KEY_LEFT_ALT, ' ');
    Keyfr("f");
  }
}

// Fonction pour exécuter une commande simple
// A modifier ou compléter
void Key(const String &Texte){
  if (Texte=="entree"){
    Keyboard.write(KEY_RETURN);
  }else if (Texte=="echap"){
    Keyboard.write(KEY_ESC);
  }else if (Texte=="retour"){
    Keyboard.write(KEY_BACKSPACE);
  }else if (Texte=="droite"){
    Keyboard.write(KEY_RIGHT_ARROW);
  }else if (Texte=="gauche"){
    Keyboard.write(KEY_LEFT_ARROW);
  }else if (Texte=="haut"){
    Keyboard.write(KEY_UP_ARROW);
  }else if (Texte=="bas"){
    Keyboard.write(KEY_DOWN_ARROW);
  }else if (Texte=="f1"){
    Keyboard.write(KEY_F1);
  }
}

void setup() {
  delay(8000);
  Keyboard.begin();
}

void loop() {
  static int oneloop=0;

  if (oneloop==0){
    oneloop=1;
    
    Keyspecial("window+r"); // Lance la fenêtre exécuter
    Keyfrln("notepad");
    delay(2000);
    Keyfr("abcdefghijklmnopqrstuvwxyz");
    Keyfr("\t"); // \t = tabulation
    Keyfrln("01234\t56789");
    Keyfrln("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
    Keyfrln("@~_-+=|<>()[]{}\\/&`^'\"%?!:,;*$.#");

    Keyspecial("selectionner");
    Keyspecial("copier");
    Key("droite");
    Key("entree");
    Keyspecial("coller");
    
    delay(1000);
    Keyspecial("fermer"); // fermeture de la fenêtre par ALT+F4
    Key("droite");
    delay(1000);
    Key("entree");
    
    delay(1000);
    Keyspecial("window+r"); // Lance la fenêtre exécuter
    Keyfrln("cmd");
    delay(1000);
    Keyfrln("ipconfig /all");
    delay(2000);
    Keyspecial("menufermer"); // ouvre le menu system et choisi 'Fermer' comme si on cliquait sur l'icone de l'application
    Keyboard.end();
  }
}

J'ai vérifié comment ça se présentait avec le clavier virtuel Qwerty, du coup j'ai rajouté le caractère oublié ^ ainsi que l'espace et j'ai laissé le traitement des deads keys comme il était, c'est à dire qu'ils sont traités comme des caractères normaux donc inutile de les taper deux fois, le programme se charge de le faire et ensuite en supprime un pour ne laisser apparaître qu'un seul caractère.

J'ai aussi modifié la fonction Keycombi pour que l'on puisse faire aussi bien (CTRLouALT)+touche de caractère ou (CTRLouALT)+touche de fonction, dans l'exemple je l'utilise pour faire un ALT+F4.

On peut modifier la valeur de la tempo qui est une variable maintenant.

Le code ci-dessus a été modifié.

N'hésiter pas à me faire des remontés.

Superbe boulot,
Bravo et merci.

Merci pour votre retour :slight_smile: , j'ai remarqué des erreurs que je viens de corriger, voir le code précédent, je fatigue.

J'ai regardé le code de Nicohood pour une intégration parce que j'aimerais bien avoir la notification des leds. Apparemment on ne peut pas directement envoyer des scancodes, la solution serait d'inclure un fichier layout.

Super ! :slight_smile:
Enfin une solution qui fonctionne pour les claviers français.

Je désespérait d'arriver à obtenir certains caractères comme les signes supérieur et inferieur ou la barre verticale. C'était la galère sous unix pour tapper le moindre truc du genre:
ifconfig | grep inet >> foo.txt
Un grand merci, ce code est d'une aide précieuse pour la communauté francophone.

Et maintenant la question à 100 balles: Comment faire pour que ça fonctionne sur un Mac ? Comment utiliser la touche 'POMME' () ?

Parce que dans ton code il y a par exemple:

void copy(){
  sendkeycombi(KEY_LEFT_CTRL, 'c');

Ça fait un Ctrl-c, mais il faudrait un POMME-c sur Mac.
J'imagine que cette touche correspond à celle qui est siglée 'WINDOWS' sur un clavier PC.

[EDIT]
Je suis con, cette touche c'est KEY_LEFT_GUI !
Il suffit de faire sendkeycombi(KEY_LEFT_GUI, 'c') pour faire POMME-c.

[EDIT2]
J'édite à mesure que je patauge !
En fait il y a plein de trucs qui ne vont pas si on est sous MacOSX. Voici ce que donne le sketch:

Caractères spéciaux pris en charge directement (l'éditeur doit être compatible)
128144212 145 0156 155157 232425262729 16173031 12 3456 1112 1314 15 01470148 015301690174

Alphabet miniscule
abcdefghijklmnopqrstuvxyz

Alphabet majuscule
ABCDEFGHIJKLMNOPQRSTUVXYZ

Chiffre
0123456789

Accents et cédille
àùéèç

Dead key
âêîôûäëïöüÿ ÂÊÎÔÛÄËÏÖÜ 2277

Opération mathématique
/`§_-

Ponctuation et caractères d'ouverture et de fermeture
,;:=?<>()54=

Autres
@*+9%$30£"

Unicode exemple
2627

Clavier numérique
0123456789
/*-+

Tout l'unicode qui s'obtient par alt+xxxx est spécifique à Windows. Pour obtenir ces symboles sous MacOSX il faut passer par le 'visualiseur de caractères'.


Merci pour votre retour, je n'ai pas de Mac mais je viens de passer un peu de temps à comprendre comment fonctionne le clavier du Mac et j'ai l'impression que ça ne devrait pas poser de problème pour l'adapter.

Je vais y travailler cette semaine et j'aimerais bien pouvoir vous envoyer du code à tester directement par message privé si vous le permettez. Dites-moi si cela vous convient.

Oui, bien sûr.
Je testerai le code avec plaisir.

[EDIT]
Truc étrange: la lettre W ne s'affiche pas. Ni en majuscule, ni en minuscule, que ce soit sur Mac ou PC.