Home >Backend Development >C++ >How to send multiple characters using SendInput and manage Unicode considerations?
When sending characters using SendInput, it's important to understand how to handle multiple characters.
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.
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:
Therefore, to send 2 characters, you need 4 INPUT structures.
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.
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!