Home > Backend Development > C++ > body text

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

Mary-Kate Olsen
Release: 2024-10-25 04:15:29
Original
562 people have browsed it

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>
Copy after login

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!

source:php.cn
Statement of this Website
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
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!