|
Création d’un clavier Windows personnalisé Pour utiliser la méthode qui est développée ici, et pour créer son propre clavier sous Windows XP, Vista, Windows 7 et suivants, sous les diverses versions 32 bits ou 64 bits (amd64, ia64, i386, wow64). On s’aidera de l’utilitaire Microsoft Keyboard Layout Creator 1.4 (MSKLC) disponible gratuitement chez Microsoft. Il s’avère cependant qu’avec MSKLC les touches mortes sont en général inutilisables, et que les touches modifiables ne concernent qu’une partie du clavier. La procédure permet de corriger ces défauts par le biais de quelques connaissances en informatique et en particulier de programmation C/C++. Le paquetage contient les sources du clavier multilingue :
InstallationEn regardant le contenu des répertoires où est installé MSKLC, on trouve les fichiers cl.exe, c1.dll, c2.dll, link.exe, rc.exe, qui correspondent à un compilateur C complet avec éditeur de liens et compilateur de ressources. Donc, quelque part MSKLC doit créer un programme C, le compiler puis effacer les sources C après usage. En fait kbdutool.exe utilisé directement à partir de la ligne de commande permet d’obtenir ces sources. Le script Sources.bat facilite l’obtention de ces sources et le script Compile.bat permet de compiler les sources et d’obtenir un nouveau pilote. La procédure est la suivante :
Cette méthode a l’avantage que l’on peut tester à volonté le même pilote de clavier et comprendre l’usage de chaque structure. Images de la disposition du clavier KbFrVmu. Autres exemples de pilotes de clavier Grec classique polytonique à partir du clavier français, Clavier français élargi. Autre méthode par le WDKOn peut également créer des pilotes de clavier à
partir du Windows Driver Kit (WDK)
sans utiliser MSKLC. La procédure doit être adaptée pour les pilotes 64 bits en fonction de l’architecture de la machine (système d’exploitation et processeurs). Les spécifications des claviers sont données dans le fichier C:\WinDDK\7600.16385.0\inc\api\kbd.h, et dans la documentation du WDK. Description du fonctionnement d’un clavierChaque touche du clavier est considérée comme un interrupteur, lorsqu’on appuie sur une touche, le clavier renvoie un numéro que l’on appelle le scan code. Lorsqu’on relâche la touche, le clavier envoie à nouveau un scan code à l’ordinateur. Mais certaines touches ne renvoient pas un scan code, mais deux ou trois : le premier octet envoyé est toujours 224 (0xE0 en hexadécimal), ou 225 (0xE1). 0xE0 signale qu’un autre octet suit, et 0xE1 que deux octets suivent. Seules quelques touches renvoient deux octets, et la seule touche renvoyant trois octets est la touche Pause. En fait, seules les touches qui font double emploi renvoient plusieurs octets, ce qui permet de les distinguer. Par exemple une des touches Origine renvoie 0x47, l’autre renvoie 0xE0 0x47. Quand on relâche ces touches, elles renvoient les mêmes octets. La touche Pause, elle, renvoie en rafale les six codes 0xE1 0x1D 0x45 0xE1 0x9D 0xC5. Scan codes des touches sur
le clavier américain. Description des structures de données utiliséesI – Fichier HModifier KbFrVmu.H avec le Bloc-notes. Le clavier Anglais (États-Unis) – kbdus.dll – est à l’origine de tous les claviers. La disposition AZERTY du clavier français en diffère selon la redéfinition des touches suivante : OEM_4, 'A', 'Z', OEM_6, OEM_1, 'Q', 'M', OEM_3, OEM_7, 'W', OEM_COMMA, OEM_PERIOD, OEM_2, OEM_8. Certaines touches ont un scan code étendu extended key (KBDEXT) et sont précédées de la lettre X (touche Control droite X1D). Les autres touches sont précédées de la lettre T (touche Entrée T1C). Pour KbFrVmu.H,
on a en particulier : La redéfinition est alors : #undef T35 #undef X1D Conséquence dans KbFrmuVmu.C, dans la structure aVkToWch<n> la touche virtuelle VK_OEM_8 (normalement associée à la touche [§ !] du clavier français) est remplacée en VK_OEM_ATTN (voir plus bas dans la table aVkToWch7). II – Fichier CModifier KbFrVmu.C avec le Bloc-notes. ausVK La première table ausVK contient la table de conversion des codes clavier (scan code) vers les touches virtuelles Windows (Virtual keys). Les macros T01 à T7F sont définies dans kbd.h se trouvant quelque part dans le répertoire d’installation de MSKLC et également dans le DDK. (N.B. le KBD_TYPE est 4 pour la plupart des claviers actuels non asiatiques). Certaines de ces macros peuvent être redéfinies dans le .H spécifique du clavier (ex : KbFrVmu.H). La table est adressable directement par le scan code. aE0VscToVkLa table aE0VscToVk contient la table de conversion des scan codes doubles (0xE0 0x??) vers les touches virtuelles Windows correspondantes. aE1VscToVkLa table aE1VscToVk contient la table de conversion des scan codes triples (0xE1 0x?? 0x??) vers les touches virtuelles Windows correspondantes. Inutile de modifier ces tables. aVkToBitsLa table aVkToBits définit les touches bascule (Shift, Ctrl, Alt) et associe un bit à chacune d’elles (KBDSHIFT = 0x01, KBDCTRL = 0x02, KBDALT= 0x04). Comme il y a trois bits apparemment, le clavier peut donc être dans huit états. (VK_MENU est la touche Alt de gauche). Windows gère de façon particulière la touche Alt-Gr, théoriquement VK_RMENU, en combinant les deux touches VK_CONTROL et VK_MENU. En fait on peut utiliser d’autres bits supplémentaires et les associer à d’autres touches, ce qui peut fournir beaucoup plus d’états possibles, notamment pour les claviers asiatiques (KBDKANA = 0x08). static ALLOC_SECTION_LDATA
VK_TO_BIT aVkToBits[] = { CharModifiers La table CharModifiers transforme les différentes valeurs précédentes en index dans les tables qui suivent.
La première entrée de cette table contient l’adresse de la table précédente, l’entrée suivante indique le nombre d’états - 1 du clavier (ici 9), les entrées suivantes donnent les index correspondants. SHFT_INVALID indique que la combinaison est interdite (ou utilisée par Windows). Ici dans le clavier multilingue, les combinaisons Shift + Ctrl, Alt, Shift + Alt sont interdites.
Les tables suivantes sont réellement les plus utiles. Ce sont elles qui assignent des valeurs Unicode à chaque touche. aVkToWch<n>Les premières tables utiles sont aVkToWch<n> (<n> allant de 1 à 7, et même de 8 à 10 pour les claviers asiatiques). Ces tables associent n valeurs Unicode à chaque touche virtuelle Windows. Ces tables ont toutes la même structure, chaque entrée contient : Un attribut, <n> valeurs Unicode ou spéciales. Chaque code est indexé avec les valeurs venant de la table CharModifiers. L’attribut peut être une combinaison de ces différentes valeurs :
Les valeurs spéciales peuvent être :
Il y a donc une table aVkToWch7 car on a sept états possibles, et chaque entrée contient neuf valeurs : la touche virtuelle, un attribut, et sept valeurs Unicode qui correspondent aux sept états ci-dessus. Exemple : {'A' ,CAPLOK | CAPLOKALTGR,'a' ,'A' ,WCH_NONE ,0x00e6 ,0x00c6 ,0xfb00 ,WCH_NONE },La touche virtuelle A, renvoie les valeurs suivantes en fonction de l’état des touches bascule :
Comme la touche T35 a été redéfinie dans le fichier H pour les besoins de la touche Kana (VK_OEM_ATTN à la place de VK_OEM_8) , on a alors : {VK_OEM_ATTN
,0 ,'!' ,0x00a7 ,WCH_NONE
,0x00a1 ,WCH_NONE ,WCH_NONE ,WCH_DEAD }, La valeur WCH_DEAD indique que l’entrée sera directement suivie par une entrée spéciale pour définir la valeur de cette touche morte. La touche virtuelle associée à cette entrée supplémentaire est 0xff. Exemple : {'S' ,CAPLOK ,'s'
,'S' ,WCH_NONE ,0x00df ,0x017f
,WCH_NONE ,WCH_DEAD }, La touche virtuelle S renvoie les valeurs suivantes en fonction de l’état des touches bascule :
N.B. : Le comportement de chaque touche morte est défini dans la table aDeadKey. Si l’attribut contient SGCAPS, cette entrée sera directement suivie par une entrée spéciale (de type aVkToWch2) pour définir les codes à renvoyer lorsque le clavier est en mode CapsLock. La touche virtuelle associée à cette entrée supplémentaire est la même que l’entrée principale. Exemple : {'N' ,SGCAPS
,'n' , 'N' ,WCH_NONE ,'£', WCH_NONE }, La touche virtuelle N a quatre états Shift, et renvoie les valeurs :
Il est possible de combiner l’attribut SGCAPS et un signe diacritique sur la même touche. Cela devient un peu compliqué pour Windows, mais c’est le comportement habituel des claviers Macintosh ou Linux. Exemple : {'7' ,SGCAPS
,0x00e8 , '7' ,WCH_NONE ,WCH_DEAD ,WCH_NONE ,0x201e ,
WCH_NONE }, La touche virtuelle 7 renvoie les valeurs suivantes en fonction de l’état des touches bascule :
La valeur WCH_LGTR indique une touche ligature, ou plus exactement une touche pouvant renvoyer plusieurs unités de code. Le nom de ligature vient du fait que ces touches sont normalement utilisées pour produire une suite de valeurs Unicode devant se combiner avec le dernier caractère introduit pour ne former qu’un seul glyphe. Les touches ligature sont définies dans la table aLigature. aVkToWcharTableCette table contient la liste de toutes les tables aVkToWch<n> à utiliser. Chaque entrée contient :
Un pointeur sur la table aVkToWch<n>,
La valeur de <n>, La taille en octets d’une entrée de la table aVkToWch<n>. N.B. : Il semble que la table aVkToWch1 doit être citée en dernier. aKeyNames, aKeyNamesExt, aKeyNamesDeadCes tables servent uniquement à nommer les touches qui ne correspondent pas à un caractère ascii. Chaque entrée des tables aKeyNames (touches envoyant un seul scan code), aKeyNamesExt (touches envoyant deux ou trois scan codes) contient deux valeurs : Le scan code de la touche,
Le nom donné à cette touche. Chaque entrée de la table aKeyNamesDead contient aussi deux valeurs : La valeur Unicode de la touche morte,
Le nom donné à cette touche morte. aDeadKey C’est une des tables les plus utiles. Elle contient toutes les combinaisons possibles des touches diacritiques avec les autres touches. Chaque entrée doit contenir un appel à la macro DEADTRANS dont les quatre paramètres sont : La valeur Unicode du caractère,
La valeur Unicode du signe diacritique, La valeur Unicode du caractère avec le signe diacritique, Un drapeau qui vaut 0 ou 1 (DKF_DEAD). Le quatrième paramètre par défaut doit être à 0. Mais s’il est à DKF_DEAD c’est que cette combinaison crée un nouveau signe diacritique, correspondant à la combinaison de plusieurs touches diacritiques. aLigature Cette table facultative contient la définition de toutes les touches ligature. Celles-ci ont la valeur WCH_LGTR dans les tables aVkToWch<n>. La touche ligature qui renvoie le plus dunités de code détermine la taille de la table. Par exemple si on a deux touches ligature en dévanâgarî. VK_OEM_4 qui renvoie les deux valeurs Unicode 0x0930 et 0x0941 (रु). La plus longue séquence renvoyant trois valeurs, il faut donc créer la table comme suit : static ALLOC_SECTION_LDATA
LIGATURE3 aLigature[] = { La première valeur du tableau est la valeur de la touche virtuelle Windows, la deuxième est l’index venant de la table CharModifiers. Les plus courtes séquences sont complétées par des WCH_NONE. Le fichier kbd.h ne contient que 4 types LIGATURE2, LIGATURE3, LIGATURE4, LIGATURE5. Mais en réalité on n’est pas limité à cinq unités de code : si on a une touche Alt-Gr + espace qui renvoie dix unités de code, par exemple *LIGATURE*, on peut déclarer la table précédente comme suit : TYPEDEF_LIGATURE(10) // LIGATURE10,
*PLIGATURE10; On peut donc créer des touches renvoyant des mots, voire des phrases. On est toutefois limité à seize unités de code TYPEDEF_LIGATURE(16). KbdTablesCette table est celle qui référence toutes les autres et dont l’adresse est renvoyée par l’API KbdLayerDescriptor défini juste après cette table et qui termine la source. static ALLOC_SECTION_LDATA
KBDTABLES KbdTables = { /* /* /* /* KBD_VERSION vaut 1 et
ne doit pas être changé. */ |