Créer un clavier à l’écran

J’utilise PostMessage pour simuler des frappes dans un programme en arrière-plan. Cela fonctionne bien, sauf pour les caractères qui doivent être décalés sur le clavier physique. Comment puis-je simuler le changement? ”

Le code que j’utilise est approximativement:

VK vk = VkKeyScanEx (c, GetKeyboardLayout (0)); AttachThreadInput (_attachedThredId, _attachedProcessId, true); PostMessage (_window, WM_KEYDOWN, vk.key, 0x1); PostMessage (_window, WM_KEYUP, vk.key, 0xC0010001); AttachThreadInput (_attachedThredId, _attachedProcessId, false); 

Comment dois-je gérer une partie étendue de VK?

modifier

J’essaie de créer un clavier à l’écran. Chaque bouton du clavier à l’écran simule une séquence de frappes. Le récepteur est un ancien programme qui effectue différentes tâches en fonction de la séquence du clavier à exécuter. Les séquences de clavier sont les suivantes

  • {ESC} NN {ESC} NN
  • {ESC} NN
  • ½NN
  • §NN

où {ESC} simule en appuyant sur la touche Echap, NN sont des valeurs hexadécimales et § / ½ oblige le programme à écouter.

Nous avons normalement un clavier physique spécial pour contrôler le programme, mais ils sont coûteux. Donc, dans un environnement de test où nous n’avons pas toujours les claviers physiques, nous devons entrer ces codes manuellement

Vous devez faire des compromis:

Si vous souhaitez simuler une entrée au clavier , vous devez utiliser SendInput , ce qui signifie être à la merci de la fenêtre actuellement active. SendInput c’est comme SendInput sur les touches de votre clavier physique. La seule façon d’envoyer vos séquences de touches à une fenêtre spécifique à l’aide de votre clavier consiste à ALT+TAB dans la fenêtre de droite.

Si vous souhaitez envoyer des frappes au clavier à une fenêtre spécifique , vous rencontrez un comportement funky:

  1. Les applications traitent les entrées différemment. Et les simples messages WM_KEYDOWN / WM_KEYUP ne sont pas le seul moyen de détecter une entrée au clavier. Par exemple, il existe également l’état du clavier ( GetKeyboardState() ) que vous aurez plus de mal à simuler. C’est probablement ce que vous vivez.
  2. Les applications peuvent avoir recours au comportement standard consistant à avoir le focus lors de la réception de messages d’entrée au clavier. En publiant des messages dans ces applications, vous invoquez un comportement étrange et désordonné susceptible de les bloquer.
  3. Désormais, plusieurs fenêtres du système peuvent recevoir une entrée au clavier en même temps. Cela pourrait aussi provoquer un comportement étrange.
  4. (etc …) Les hooks ne seront pas appelés pour cette entrée, votre clavier / les pilotes d’entrée ne le verront pas, il ne sera pas reconnu par des choses comme DirectInput … en gros, c’est un patchwork infini de problèmes de faire quelque chose à la manière des méchants.

Il n’y a pas moyen de contourner ces effets secondaires; c’est la conséquence de faire des trucs louches.


Parce que vous ciblez une seule application spécifique, une solution à vos objectives peut être d’utiliser PostMessage avec SetKeyboardState pour simuler l’état du clavier, y compris les positions de décalage.

OK, je pense que vous allez vous PostMessage() , PostMessage() est connu pour ne pas bien fonctionner avec les états de décalage et les hooks ne sont pas appelés non plus. Microsoft recommande SendInput() place, et moi aussi. Je vous suggère de poster une nouvelle question ou de mettre à jour celle-ci, dans laquelle vous expliquez en détail vos objectives, et nous pourrons peut-être mieux recommander une solution différente.

Quant à la partie étendue, elle n’a absolument rien à voir avec cela et ne vous aidera pas.

Ce que vous pouvez essayer, c’est d’envoyer un message WM_KEYDOWN indiquant que la touche Majuscule a été enfoncée, puis d’envoyer un autre message avec la clé souhaitée avant d’envoyer un message Maj WM_KEYUP. Je doute que cela fonctionne, mais vous pouvez toujours essayer.

Personnellement, j’utiliserais SendKey.Send () à cette fin.

Page MSDN