Comment déterminer la disposition du clavier pour un autre processus (Windows)?

Je travaille sur un programme qui doit enregistrer et lire les frappes. Le processus principal s’exécute en tant que service et nécessite donc un programme de configuration pour enregistrer les séquences de touches.

Le problème survient lorsque la disposition du clavier par défaut du système est l’anglais (par exemple) et que la disposition du clavier de l’utilisateur pour le moment est (disons) l’allemand. L’utilisateur entre un caractère «ü» dans l’interface de configuration, qui est dûment enregistré et stocké.

Maintenant, l’utilisateur exécute le Bloc-notes et tente de lire la frappe de la touche, qui est effectuée par un enfant du service. Lors de la transformation d’une entrée pour passer à SendInput , nous appelons VkKeyScan , qui nous indique alors qu’il n’y a aucun moyen de reproduire ce caractère sur ce clavier (rappelez-vous que la disposition de clavier par défaut est l’anglais).

Ce que je voudrais vraiment faire, c’est synchroniser les dispositions de clavier du service et l’application de premier plan actuelle, afin que le service puisse reproduire n’importe quel caractère avec son clavier. GetKeyboardLayout ne fonctionne que dans le processus en cours. Cela doit s’exécuter à la fois sur 32 et 64 bits, donc un hook de message n’est pas préféré :).

Pour récupérer la disposition du clavier pour la fenêtre de premier plan:

 GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), NULL)) 

On dirait que vous enregistrez des caractères plutôt que des frappes. Au lieu d’envoyer des séquences de touches lors de la relecture, pouvez-vous utiliser SendMessage pour envoyer des messages WM_CHAR avec les caractères enregistrés au lieu de générer des séquences de touches?