Это не документация по MSDN, но при использовании KEYEVENTF_UNICODE
, если для заданной кодовой точки Unicode требуется использование суррогатов UTF-16, вам необходимо отправить оба суррогата без KEYEVENTF_KEYUP
, затем отправить обоих суррогатов с KEYEVENTF_KEYUP
.Код, который вы показали, совсем не учитывает суррогаты UTF-16, он отправляет входные данные для каждого суррогата независимо друг от друга.Два суррогата должны быть одновременно «вниз», а затем «вверх» одновременно.
Вместо этого попробуйте что-нибудь более подобное (основываясь на предыдущем ответе , который я написал длята же проблема в C ++):
/// <summary>
/// Sends Unicode (UTF16) string to foreground window.
/// </summary>
/// <param name="inputString">String to be sent to foreground window.</param>
internal static void Send(string inputString)
{
if (string.IsNullOrEmpty(inputString))
{ return; }
char[] chars = inputString.ToCharArray();
int len = chars.Length;
INPUT[] pInputs = new INPUT[len * 2];
UInt32 ExtraInfo = GetMessageExtraInfo();
int i = 0, idx = 0;
while (i < len)
{
UInt16 ch = chars[i++];
if ((ch < 0xD800) || (ch > 0xDFFF))
{
pInputs[idx] = new INPUT();
pInputs[idx].type = INPUT_KEYBOARD;
pInputs[idx].ki.wVk = 0;
pInputs[idx].ki.wScan = ch;
pInputs[idx].ki.dwFlags = KEYEVENTF_UNICODE;
pInputs[idx].ki.time = 0;
pInputs[idx].ki.dwExtraInfo = ExtraInfo;
++idx;
pInputs[idx] = new INPUT();
pInputs[idx].type = INPUT_KEYBOARD;
pInputs[idx].ki.wVk = 0;
pInputs[idx].ki.wScan = ch;
pInputs[idx].ki.dwFlags = KEYEVENTF_UNICODE | KEYEVENTF_KEYUP;
pInputs[idx].ki.time = 0;
pInputs[idx].ki.dwExtraInfo = ExtraInfo;
++idx;
}
else
{
UInt16 ch2 = chars[i++];
pInputs[idx] = new INPUT();
pInputs[idx].type = INPUT_KEYBOARD;
pInputs[idx].ki.wVk = 0;
pInputs[idx].ki.wScan = ch;
pInputs[idx].ki.dwFlags = KEYEVENTF_UNICODE;
pInputs[idx].ki.time = 0;
pInputs[idx].ki.dwExtraInfo = ExtraInfo;
++idx;
pInputs[idx] = new INPUT();
pInputs[idx].type = INPUT_KEYBOARD;
pInputs[idx].ki.wVk = 0;
pInputs[idx].ki.wScan = ch2;
pInputs[idx].ki.dwFlags = KEYEVENTF_UNICODE;
pInputs[idx].ki.time = 0;
pInputs[idx].ki.dwExtraInfo = ExtraInfo;
++idx;
pInputs[idx] = new INPUT();
pInputs[idx].type = INPUT_KEYBOARD;
pInputs[idx].ki.wVk = 0;
pInputs[idx].ki.wScan = ch;
pInputs[idx].ki.dwFlags = KEYEVENTF_UNICODE | KEYEVENTF_KEYUP;
pInputs[idx].ki.time = 0;
pInputs[idx].ki.dwExtraInfo = ExtraInfo;
++idx;
pInputs[idx] = new INPUT();
pInputs[idx].type = INPUT_KEYBOARD;
pInputs[idx].ki.wVk = 0;
pInputs[idx].ki.wScan = ch2;
pInputs[idx].ki.dwFlags = KEYEVENTF_UNICODE | KEYEVENTF_KEYUP;
pInputs[idx].ki.time = 0;
pInputs[idx].ki.dwExtraInfo = ExtraInfo;
++idx;
}
}
uint nSent = SendInput((uint)pInputs.Length, pInputs, Marshal.SizeOf(typeof(INPUT)));
if (nSent == 0)
{
Debug.WriteLine("SendInput error " + GetLastError().ToString());
}
}