Winapi – Codes d’parsing étendus du clavier

Si je voulais simuler une pression sur une touche en utilisant un code d’parsing étendu tel que 0xE0 0x1D (pour CTRL droit), comment simuler une telle pression sur C? J’ai essayé d’appeler SendInput avec deux structures INPUT , mais seule la touche CTRL gauche a été “enfoncée”. La même chose se produit dans le cas d’autres clés qui ont un “jumeau” (Maj et Alt).

Deuxièmement, comment provoquer un événement de saisie pour une clé “étendue”?

La structure KEYBDINPUT a un indicateur KEYEVENTF_EXTENDEDKEY pour gérer l’octet 0xE0 pour vous:

S’il est spécifié, le code d’parsing a été précédé d’un octet de préfixe ayant la valeur 0xE0 (224).

Essayez quelque chose comme ça:

 INPUT inputs[2]; ZeroMemory(inputs, sizeof(inputs)); inputs[0].type = INPUT_KEYBOARD; inputs[0].ki.wScan = 0x1D; inputs[0].ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_EXTENDEDKEY; CopyMemory(&inputs[1], &inputs[0], sizeof(INPUT)); inputs[1].ki.dwFlags |= KEYEVENTF_KEYUP; SendInput(2, inputs, sizeof(INPUT)); 

Cependant, je suggère d’utiliser une clé virtuelle au lieu d’un code de numérisation:

 INPUT inputs[2]; ZeroMemory(inputs, sizeof(inputs)); inputs[0].type = INPUT_KEYBOARD; inputs[0].ki.wVk = VK_CONTROL; inputs[0].ki.dwFlags = KEYEVENTF_EXTENDEDKEY; CopyMemory(&inputs[1], &inputs[0], sizeof(INPUT)); inputs[1].ki.dwFlags |= KEYEVENTF_KEYUP; SendInput(2, inputs, sizeof(INPUT)); 

Mais si vous avez absolument besoin d’un code d’parsing, jetez un coup d’oeil à MapVirtualKey() pour convertir une clé virtuelle en code d’parsing:

 inputs[0].type = INPUT_KEYBOARD; inputs[0].ki.wScan = MapVirtualKey(VK_RCONTROL, MAPVK_VK_TO_VSC); inputs[0].ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_EXTENDEDKEY; 

Vous n’avez pas spécifié si les clés doivent être envoyées à la même application ou à une autre application. En utilisant SendInput, nous ne pouvons pas spécifier où vont les clés. Nous devons nous assurer que la fenêtre est active et que le focus est correctement défini. Notez qu’un SendInput enverra un message WM_KEYDOWN ou WM_KEYUP. Vous avez plus de flexibilité si vous utilisez directement SendMesage pour envoyer des messages WM_KEYDOWN et WM_KEYUP. Vous spécifiez le handle de fenêtre de la fenêtre à envoyer. Le handle de fenêtre est pour une zone de texte ou un contrôle qui prend du texte, pas la fenêtre dans laquelle se trouve la zone de texte ou tout autre contrôle.

Voici comment déterminer les parameters exacts à utiliser dans un SendMessage. Notez qu’un SendInput produira un SendMessage.

Dans Visual Studio, cliquez sur le menu Outils. Vous verrez “Spy ++” et “Spy ++ x64”. Je ne suis pas sûr quand on a besoin de l’un ou de l’autre mais si l’un ne fonctionne pas, alors essayez l’autre. Dans Spy ++, cliquez sur le menu Messages puis sur “Options de journalisation …”. Dans la zone supérieure droite, cliquez sur l’outil Findor et faites-le glisser vers une fenêtre. Après avoir relâché la souris, cliquez sur l’onglet Messages. Cliquez ensuite sur “Effacer tout” puis cochez la case “Clavier”. Notez que le menu Messages a également des commandes pour démarrer et arrêter la journalisation, mais je pense qu’il est activé par défaut. Accédez à la fenêtre sélectionnée et tapez les clés que vous souhaitez essayer. Ensuite, regardez les messages enregistrés dans Spy ++. Vous verrez tous les messages qui ont été envoyés à / de la fenêtre. J’arrête généralement la journalisation dès que j’ai tout ce dont j’ai besoin, car selon les messages sélectionnés pour la journalisation, il pourrait y avoir trop de messages enregistrés pour être utiles. Si vous ne consignez que des messages de clavier, vous ne recevrez pas trop de messages enregistrés.

Pour moi, le champ Extended est 1 pour la droite Ctrl et 0 pour la gauche Ctrl.