我在 C# 中遇到这个项目的问题:当使用 WinAPI SendInput 函数时
/// <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 (inputString == string.Empty)
{ return; }
char[] chars = inputString.ToCharArray();
INPUT[] pInputs = new INPUT[chars.Length * 2];
for (int i = 0; i < chars.Length; i++)
{
UInt16 unicode = chars[i];
pInputs[i * 2] = new INPUT();
pInputs[i * 2].type = INPUT_KEYBOARD;
pInputs[i * 2].ki.wVk = 0;
pInputs[i * 2].ki.wScan = unicode;
pInputs[i * 2].ki.dwFlags = KEYEVENTF_UNICODE;
pInputs[i * 2].ki.time = 0;
pInputs[i * 2].ki.dwExtraInfo = SetMessageExtraInfo(IntPtr.Zero);
pInputs[i * 2 + 1] = new INPUT();
pInputs[i * 2 + 1].type = INPUT_KEYBOARD;
pInputs[i * 2 + 1].ki.wVk = 0;
pInputs[i * 2 + 1].ki.wScan = unicode;
pInputs[i * 2 + 1].ki.dwFlags = KEYEVENTF_UNICODE | KEYEVENTF_KEYUP;
pInputs[i * 2 + 1].ki.time = 0;
pInputs[i * 2 + 1].ki.dwExtraInfo = SetMessageExtraInfo(IntPtr.Zero);
}
uint nSent = SendInput((uint)chars.Length * 2, pInputs, Marshal.SizeOf(typeof(INPUT)));
if (nSent == 0)
{
Debug.WriteLine("SendInput error " + GetLastError().ToString()); // error 87 : "The parameter is incorrect."
}
}
在记事本或 VS 等桌面应用程序中,代码运行良好,但在其他应用程序中,它不适用于简单的英文字母和标点符号。
像“íáó”这样带有特殊字符的字符串可以显式/通用地工作,但是像“My car”这样的字符串则不行。显然,“我的车”中的字符的 utf-16 值较低,小于 100; á 和 í 的值分别为 225 和 237。看似表面的差异。
有人知道如何使用 SendInput 将常规英文字母作为 Unicode 发送到任意窗口吗?
这不是 MSDN 上的文档,但是在使用时KEYEVENTF_UNICODE
,如果给定的 Unicode 代码点需要使用 UTF-16 代理,则需要发送both代理人没有KEYEVENTF_KEYUP
, then send both代理人与KEYEVENTF_KEYUP
。您显示的代码根本不考虑 UTF-16 代理,它独立地为每个代理发送向下/向上输入。两个代理需要同时“向下”,然后同时“向上”。
尝试更像这样的东西(基于之前的回答 https://stackoverflow.com/a/31307429/65863我在 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());
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)