Mac : Pour en finir avec les problèmes de clavier de Microsoft Remote Desktop App

Mac : Pour en finir avec les problèmes de clavier de Microsoft Remote Desktop App

Microsoft Remote Desktop IconDepuis plus d’un an déjà, Microsoft fournit gratuitement une application appelée Microsoft Remote Desktop pour accéder à une machine (souvent sous Windows) à travers RDP, depuis un Mac ou un périphérique iOS ou Androïd. Cette version devrait un jour remplacer une autre application gratuite fournie par Microsoft : Connexion Bureau à Distance pour Mac. De mémoire, cette dernière avait pris son temps pour gérer pleinement les claviers Mac en langue étrangère. Il semble qu’il en est de même pour cette nouvelle App pour qui ce problème ne semble pas une priorité. En effet, pour l’heure cette App considère que vous utilisez un clavier de type PC sur votre Mac.

Comme Microsoft Remote Desktop reste quand même un produit prometteur (en particulier, il supporte RemoteApp depuis un Mac, xfreerdp étant un peu décevant sur ce point), je me suis dit que cela méritait un peu de recherche. Après pas mal de fausses pistes, j’ai trouvé 2 méthodes différentes pour pallier au problème, l’une étant plus élégante que l’autre.

À propos de la gestion du clavier par les systèmes d’exploitation

De façon schématique, on peut dire qu’un clavier est géré par le système d’exploitation (SE) à 2 niveaux. Un niveau qu’on pourrait appeler « hard » et un autre « soft ». Au niveau « hard », des impulsions électriques correspondant aux mouvements des touches sur le clavier sont envoyées au SE, celui-ci appelle le driver du clavier qui interprète ces impulsions et les traduits en évènements d’appui ou de relâchement sur des touches, exploitables plus aval par le SE. Le signal électrique associé à l’appui sur la 1ère touche après la tabulation devient par exemple : la touche « 0x0  » a été pressée. Le niveau « soft » définit justement l’exploitation qui doit être faite de cette information par le système d’exploitation. C’est là qu’apparaît la notion de disposition de clavier. On peut décider que si le clavier est AZERTY la touche « 0x0  » affiche un « A » et que si le clavier est QWERTY, il affiche un « Q ».

Sur Mac, il existe un outil open-source pour travailler au niveau « hard », c’est Karabiner et un autre pour travailler au niveau « soft » : Ukelele. Le second est légèrement plus simple d’approche, aussi j’ai commencé par là, surtout parce que je l’avais déjà mis en œuvre pour utiliser des programmes de type VNC vers des machines Windows depuis un Mac. Malheureusement, assez vite, je suis arrivé à la conclusion que Microsoft Remote Desktop travaillait au niveau « hard » et donc qu’il ne servait à rien de chercher à redéfinir une nouvelle disposition de clavier côté client.

Fort de cette conclusion, il ne reste que 2 pistes :

  • Travailler au niveau « hard » avec Karabiner sur le client
  • Travailler au niveau « soft » sur le serveur RDP

Une quasi-solution si vous vous connectez à Windows Serveur 2012 ou Windows 8

Sur Windows 2012, il semblerait que la gestion des dispositions de clavier ait été largement améliorée. Aussi, si vous définissez une disposition pour votre clavier Mac, vous pouvez :

  • Proposer cette disposition dès l’écran de login ce qui permet à vos utilisateurs de taper les mots de passe malgré l’inversion de certaines touches entre clavier Mac et PC (l’utilisateur devra toutefois sélectionner manuellement la disposition de clavier ad hoc ce qui nécessitera une formation)
  • Demander à ce que toutes les applications déjà ouvertes basculent vers cette disposition de clavier si vous en changer en cours de session

Maintenant, ne disposant pas de machines sous Windows Server 2012, je ne peux pas vous l’assurer. C’est le résultat de lectures, mais si c’est vraiment le cas, il suffit alors de définir (ou récupérer sur Internet) une disposition pour votre clavier Mac et demander à changer de clavier lorsque vous vous connectez depuis votre Mac. Si vous n’en trouvez pas, un outil gratuit et assez intuitif permet de créer une disposition (niveau « soft ») sous Windows : c’est Microsoft Keyboard Layout Creator (MSKLC).

La solution retenue pour vous connecter à Windows 2008 R2 ou Windows 2007 : Karabiner sur le client

Karabiner est une solution open-source qui s’appelait KeyRemap4MacBook et qui, petit à petit, a remplacé DoubleCommand. Cette application qui n’est plus maintenue permettait historiquement d’inverser les touches Cmd et CTRL de votre clavier Mac (souvent utile dans la phase d’apprentissage du Mac venant du monde PC). Karabiner semble un très bon outil très paramétrable, mais pas particulièrement user-friendly. Il est facile à utiliser, mais la création d’un mapping spécifique reste ardue. Qui plus est, dans le cas qui nous concerne c’est assez écrase cerveau.

Le remapping se fait en 2 étapes :

  • D’abord, j’identifie la touche qui est tapée sur le clavier (assez facile via l’outil EventViewer fourni par Karabiner)
  • Ensuite, j’indique la touche qui devrait être enfoncée à la place. Là, ça se complique : il faut partir du principe que si vous utilisiez un clavier de PC sur votre Mac, cela fonctionnerait. Il vous faut donc l’image d’un clavier français PC et celle d’un clavier américain US.
    • Exemple pour la touche « = » du clavier Mac français qui correspond à la touche « ! » d’un PC. Je veux un « = » : imaginons que j’ai un clavier PC, pour avoir un « = », il faut taper sur la touche à gauche de la touche d’effacement arrière. Sur un clavier Mac standard (ie. américain) cette touche est la même et s’appelle la touche EQUAL.
    • Exemple pour la touche « § » du clavier Mac français qui correspond à la touche « – » d’un PC. Je veux un « § » : imaginons que j’ai un clavier PC, pour avoir un « § », il faut taper sur la touche à gauche de la touche SHIFT droite. Sur un clavier Mac standard (ie. américain) cette touche s’appelle la touche SLASH.
Clavier Mac français
Clavier Mac français
Clavier Mac standard
Clavier Mac standard
Clavier PC français
Clavier PC français

Enfin, on peut indiquer à karabiner de n’appliquer ce remapping que pour une application particulière : Microsoft Remote Desktop.

Ceci conduit au fichier private.xml suivant :

<appdef>
  <appname>Microsoft Remote Desktop</appname>
  <equal>com.microsoft.rdc.mac</equal>
</appdef>
<item>
  <name>French Mac keyboard A1314 using the Microsoft Remote Desktop App</name>
  <appendix>Assure all keys writen on the keyboard to be the same on the remote server.</appendix>
  <appendix>Done for Version 8.0.12 (Build 25282)</appendix>
  <identifier>remap.mac_french_keyboard_MRD_layout</identifier>
  <only>Microsoft Remote Desktop</only>
  <!-- KEY_6 to '§' -->
  <autogen>__KeyToKey__ KeyCode::KEY_6, ModifierFlag::NONE, KeyCode::SLASH, ModifierFlag::SHIFT_R</autogen>
  <!-- KEY_8 to '!' -->
  <autogen>__KeyToKey__ KeyCode::KEY_8, ModifierFlag::NONE, KeyCode::SLASH, ModifierFlag::NONE</autogen>
  <!-- FRENCH_MINUS to '-' -->
  <autogen>__KeyToKey__ KeyCode::FRENCH_MINUS, ModifierFlag::NONE, KeyCode::KEY_6, ModifierFlag::NONE</autogen>
  <!-- FRENCH_MINUS + Shift to '_' -->
  <autogen>__KeyToKey__ KeyCode::FRENCH_MINUS, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_SHIFT | ModifierFlag::NONE, KeyCode::KEY_8, ModifierFlag::NONE</autogen>
  <!-- FRENCH_@ to '@' -->
  <autogen>__KeyToKey__ KeyCode::RawValue::0xa, ModifierFlag::NONE, KeyCode::KEY_0, ModifierFlag::OPTION_R</autogen>
  <!-- FRENCH_@ + Shift to '#' -->
  <autogen>__KeyToKey__ KeyCode::RawValue::0xa, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_SHIFT | ModifierFlag::NONE, KeyCode::KEY_3, ModifierFlag::OPTION_R</autogen>
  <!-- FRENCH_DOLLAR + Shift to '*' -->
  <autogen>__KeyToKey__ KeyCode::FRENCH_DOLLAR, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_SHIFT | ModifierFlag::NONE, KeyCode::KEYPAD_MULTIPLY, ModifierFlag::NONE</autogen>
  <!-- FRENCH_DOLLAR + AltGr to '€' -->
  <autogen>__KeyToKey__ KeyCode::FRENCH_DOLLAR, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_OPTION | ModifierFlag::NONE, KeyCode::E, ModifierFlag::OPTION_R</autogen>
  <!-- BACKSLASH to '`' -->
  <autogen>__KeyToKey__ KeyCode::BACKSLASH, ModifierFlag::NONE, KeyCode::KEY_7, ModifierFlag::OPTION_R</autogen>
  <!-- BACKSLASH + Shift to '£' -->
  <autogen>__KeyToKey__ KeyCode::BACKSLASH, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_SHIFT | ModifierFlag::NONE, KeyCode::FRENCH_DOLLAR, ModifierFlag::SHIFT_R</autogen>
  <!-- FRENCH_EQUAL to '=' -->
  <autogen>__KeyToKey__ KeyCode::FRENCH_EQUAL, ModifierFlag::NONE, KeyCode::EQUAL, ModifierFlag::NONE</autogen>
  <!-- FRENCH_EQUAL + Shift to '+' -->
  <autogen>__KeyToKey__ KeyCode::FRENCH_EQUAL, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_SHIFT | ModifierFlag::NONE, KeyCode::EQUAL, ModifierFlag::SHIFT_R</autogen>
</item>

Une autre solution côté serveur pour vous connecter à Windows 2008 R2 ou Windows 2007

En fait, il va s’agir de combler les manques de ces versions de Windows comparativement à Windows 8 ou Server 2012, soit :

  • permettre l’accès à une disposition de clavier compatible depuis l’écran de login Windows
  • mettre à jour automatiquement la disposition du clavier lors de la connexion grâce au planificateur de tâches, grace à Cassia et à kbswitch2

Mettre à disposition d’autres langues et disposition de clavier sur la fenêtre de login de Windows 7 ou Windows 2008 R2

Sous Windows, la fenêtre de login est lancée par un service qui s’exécute avec l’identité Local System (UID S-1-5-18). Si vous voulez que d’autres langues ou disposition de clavier soient disponibles au moment du login, il suffit de les affecter à Local System. Malheureusement, il n’y a pas à ma connaissance de solution graphique pour y parvenir. La seule que je connaisse, consiste à passer par la base de registre en copiant tout ou partie de la clef « Keyboard Layout » d’un compte pour qui on a configuré les langues et dispositions de clavier qui conviennent. Pour cela vous pouvez agir ainsi :

  1. Connectez-vous avec vos identifiants et paramétrez les langues et dispositions de clavier tel que vous souhaiteriez qu’elles soient disponibles sur l’écran de login.
  2. Ouvrer la base de registre et exporter la clef « Keyboard Layout » de HKEY_CURRENT_USER.
  3. Remplacer dans le fichier la chaîne HKEY_CURRENT_USER par HKEY_USERS\S-1-5-18.
  4. Double-cliquer sur le fichier avec des privilèges adéquats pour ajouter la nouvelle clef à Local System.

Exécuter un script au démarrage de la session ou lors d’une reconnexion à une session déjà ouverte

Lancer un script lors de l’ouverture d’une session n’est pas compliqué, par contre l’exécution d’un script lors d’une reconnexion à une session déjà ouverte est moins documentée. Une technique qui marche est de passer par le planificateur de tâches qui autorise l’exécution d’un script lors d’une reconnexion. Comme il autorise également l’exécution d’un script au lancement d’une nouvelle session, c’est véritablement l’outil adapté.

Créer un script qui identifie l’application cliente RDP et en fonction sélectionne une disposition de clavier

Notre script repose sur 2 outils :

  • Cassia, une bibliothèque qui agrège diverses informations sur la connexion RDP. Elle vient avec un exécutable SessionInfo.exe qui nous suffira amplement, par contre il faudra utiliser la version la plus récente de la bibliothèque dont les binaires ne sont pas distribués à l’heure actuelle. Il suffit donc de la recompiler à partir des sources grâce à .Net 3.5.
  • kbswitch2 un petit exécutable open-source qui associe tous les programmes déjà ouverts à une disposition de clavier donnée et lancera toute nouvelle application avec cette disposition. En d’autres termes, il fait ce que Windows 8 ou Windows Serveur 2012 font et que Windows 7 ou Windows 2008 R2 ne savent pas faire.

Il est on ne peut plus simple :

REM On se place dans le répertoire qui contient les exécutables de kbswitchv2 et le SessionInfo.exe de Cassia.
cd c:\kbswitch2v2
REM On positionne le clavier en français par défaut puis selon le résultat de SessionInfo.exe, on change ou non la disposition du clavier
kbswitch2.exe "Français" & SessionInfo.exe |findstr /C:"Client Build Number: 25282" && kbswitch2.exe "Français - Custom"

Bien entendu la disposition « Français – Custom » correspond à celle d’un clavier Mac Français pour Windows.

17 réactions au sujet de « Mac : Pour en finir avec les problèmes de clavier de Microsoft Remote Desktop App »

    1. Oui, sauf que parfois Karabiner oublie sa configuration. Il suffit alors de l’ouvrir et de décocher/cocher la règle de gestion du clavier correspondante.

  1. J’ai corrigé une petite coquille pour produire l’étoile (*). Comme ce la m’a bien énervé de ne pas trouver la touche correspondante sur un clavier non français, je suis passé par la touche étoile du pavé numérique. Cela fonctionne aussi bien avec un clavier sans fil et sans pavé qu’avec un clavier filaire Mac.

    1. Notez qu’avec Karabiner vous pouvez à peu près faire tout ce que vous voulez (c’est juste parfois écrase-cerveau d’établir certaines règles). Je me suis limité à mes besoins, mais le profil peut encore être amélioré et partagé. Je l’avais directement proposé à Karabiner mais sans succès.

  2. Un grand merci pour cet article, les infos sur Karabiner et le fichier private.xml fourni !

    J’ai enfin le – et le = à la bonne place quand je code sur un PC à distance, ça va me faire gagner un sacré temps, merci encore !!

  3. Bonjour,

    La version beta de remote Desktop gère encore très mal les raccourcis comme CTRL+z

    Le fichier Karabiner fourni fonctionne très bien, merci beaucoup.

    J’en ai profité pour ajouter le backslash qui me manquait :


    __KeyToKey__ KeyCode::DOT, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_OPTION | MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_SHIFT | ModifierFlag::NONE, KeyCode::KEY_8, ModifierFlag::OPTION_R | ModifierFlag::NONE

    En espérant que ça puisse servir.

    A+

  4. Merci pour vos explications
    J’ai cependant un dernier problème :
    sur mon clavier MAC avec un pavé numérique, la virgule (,) est en fait : un point (.)
    et c’est hyper gênant sur Excel par exemple
    auriez vous une autre idée géniale ?

  5. Merci pour le mapping.

    Cela fonctionne également avec Windows 10 Professional en Remote Desktop (sous El Capitan en tout cas)

  6. Bonjour,
    J’essaie de me connecter à distance sur mon PC pro depuis mon Mac perso. Mais sans doute pour ces questions de clavier ça ne fonctionne pas (pb d’identifiants non reconnus). Je crois que je n’arriverai pas à me servir de Karabiner ou autre solution décrite plus haut.
    Mais est-ce que le plus simple ne serait pas de brancher un clavier PC sur mon Mac ? C’est peut-être une question stupide, je ne sais pas…

    1. Je ne sais pas. Travailler sur un mac avec un clavier PC est assez pénible. Tout ceux qui sont passés par la case Mac Mini avec récupération de leurs anciens périphériques en savent quelque chose. Il faut là aussi bidouiller.

      En tout cas, j’ai le sentiment que le logiciel « Microsoft Remote Desktop » pour la France considère qu’on utilise un clavier PC. Aussi, cela devrait aider pour cette application en particulier.

Laisser un commentaire

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