Home  >  Article  >  Backend Development  >  How to send multiple characters using SendInput and manage Unicode considerations?

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

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-25 04:15:29564browse

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

Sending Multiple Characters with SendInput

When sending characters using SendInput, it's important to understand how to handle multiple characters.

Error Case: Incorrect Parameter

Your provided code attempted to send two characters but failed due to an incorrect parameter. SendInput's first parameter specifies the number of INPUT structures, but you were passing in 1 while trying to send 2.

Correct Approach: Multiple INPUT Structures

To send multiple characters, you need an array of multiple INPUT structures. Each structure represents a key event, and for each character, you require two events:

  • Keydown event
  • Keyup event

Therefore, to send 2 characters, you need 4 INPUT structures.

Unicode Considerations

When using the KEYEVENTF_UNICODE flag, you need to specify actual Unicode codepoints instead of virtual keys. Additionally, UTF-16 surrogate pairs require two sets of down/up INPUTs.

Example Code

Here's an example function for sending a Unicode string using 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>

The above is the detailed content of How to send multiple characters using SendInput and manage Unicode considerations?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn