Maison >développement back-end >C++ >Comment envoyer plusieurs caractères à l'aide de SendInput et gérer les considérations Unicode ?

Comment envoyer plusieurs caractères à l'aide de SendInput et gérer les considérations Unicode ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-25 04:15:29673parcourir

How to send multiple characters using SendInput and manage Unicode considerations?

Envoi de plusieurs caractères avec SendInput

Lors de l'envoi de caractères à l'aide de SendInput, il est important de comprendre comment gérer plusieurs caractères.

Cas d'erreur : paramètre incorrect

Le code que vous avez fourni a tenté d'envoyer deux caractères, mais a échoué en raison d'un paramètre incorrect. Le premier paramètre de SendInput spécifie le nombre de structures INPUT, mais vous passiez 1 en essayant d'en envoyer 2.

Approche correcte : plusieurs structures INPUT

Pour envoyer plusieurs caractères, vous avez besoin d'un tableau de plusieurs structures INPUT. Chaque structure représente un événement clé, et pour chaque personnage, vous avez besoin de deux événements :

  • Événement Keydown
  • Événement Keyup

Par conséquent, pour envoyer 2 caractères, vous avez besoin de 4 structures INPUT.

Considérations Unicode

Lors de l'utilisation de l'indicateur KEYEVENTF_UNICODE, vous devez spécifier des points de code Unicode réels au lieu de clés virtuelles. De plus, les paires de substitution UTF-16 nécessitent deux ensembles d'entrées down/up.

Exemple de code

Voici un exemple de fonction pour envoyer une chaîne Unicode à l'aide de SendInput :

<code class="c++">#include <vector>
#include <string>

void SendInputString(const std::wstring &str) {
    int len = str.length();
    if (len == 0) return;

    std::vector<INPUT> in(len * 2);
    ZeroMemory(&in[0], in.size() * sizeof(INPUT));

    int i = 0, idx = 0;
    while (i < len) {
        WORD ch = (WORD)str[i++];

        if ((ch < 0xD800) || (ch > 0xDFFF)) {
            in[idx].type = INPUT_KEYBOARD;
            in[idx].ki.wScan = ch;
            in[idx].ki.dwFlags = KEYEVENTF_UNICODE;
            ++idx;

            in[idx] = in[idx - 1];
            in[idx].ki.dwFlags |= KEYEVENTF_KEYUP;
            ++idx;
        } else {
            in[idx].type = INPUT_KEYBOARD;
            in[idx].ki.wScan = ch;
            in[idx].ki.dwFlags = KEYEVENTF_UNICODE;
            ++idx;

            in[idx].type = INPUT_KEYBOARD;
            in[idx].ki.wScan = (WORD)str[i++];
            in[idx].ki.dwFlags = KEYEVENTF_UNICODE;
            ++idx;

            in[idx] = in[idx - 2];
            in[idx].ki.dwFlags |= KEYEVENTF_KEYUP;
            ++idx;

            in[idx] = in[idx - 2];
            in[idx].ki.dwFlags |= KEYEVENTF_KEYUP;
            ++idx;
        }
    }

    SendInput(in.size(), &in[0], sizeof(INPUT));
}</code>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn