C# SendInput赢得';不要将基本Unicode发送到某些窗口

C# SendInput赢得';不要将基本Unicode发送到某些窗口,c#,winapi,unicode,C#,Winapi,Unicode,我对C#中的这个项目有一个问题:当使用WinAPI SendInput函数时 /// <summary> /// Sends Unicode (UTF16) string to foreground window. /// </summary> /// <param name="inputString">String to be sent to foreground window.</param> inter

我对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."
        }
    }
//
///将Unicode(UTF16)字符串发送到前台窗口。
/// 
///要发送到前台窗口的字符串。
内部静态无效发送(字符串输入字符串)
{
if(inputString==string.Empty)
{return;}
char[]chars=inputString.ToCharArray();
INPUT[]pInputs=新输入[chars.Length*2];
for(int i=0;i
在Notepad或VS等桌面应用程序中,代码可以正常工作,但在其他应用程序中,它不能与简单的英文字母和标点符号一起工作。 像“íáó”这样带有特殊字符的字符串可以显式/通用地工作,但像“My car”这样的字符串不能。显然,“我的车”中字符的utf-16值很低,小于100;á和í的值分别为225和237。这似乎是表面上的区别。
有人知道如何使用SendInput将普通英文字母作为Unicode发送到任意窗口吗?

这不是MSDN上的文档,但在使用
KEYEVENTF_Unicode
时,如果给定的Unicode码点需要使用UTF-16代理,您需要在不使用
KEYEVENTF\u KEYUP
的情况下发送两个代理,然后使用
KEYEVENTF\u KEYUP
发送两个代理。您显示的代码根本没有考虑UTF-16代理,它独立地为每个代理发送向下/向上输入。两个代理需要同时“向下”,然后同时“向上”

尝试类似的方法(基于我在C++中为同一问题发布的一篇文章):

//
///将Unicode(UTF16)字符串发送到前台窗口。
/// 
///要发送到前台窗口的字符串。
内部静态无效发送(字符串输入字符串)
{
if(string.IsNullOrEmpty(inputString))
{return;}
char[]chars=inputString.ToCharArray();
int len=字符长度;
输入[]输入=新输入[len*2];
UInt32 ExtraInfo=GetMessageExtraInfo();
int i=0,idx=0;
而(我0xDFFF))
{
pInputs[idx]=新输入();
输入[idx]。类型=输入\键盘;
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]=新输入();
输入[idx]。类型=输入\键盘;
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;
}
其他的
{
UInt16 ch2=字符[i++];
pInputs[idx]=新输入();
输入[idx]。类型=输入\键盘;
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]=新输入();
输入[idx]。类型=输入\键盘;
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]=新输入();
输入[idx]。类型=输入\键盘;
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]=新输入();
输入[idx]。类型=输入\键盘;
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)pinput.Length、pinput、Marshal.SizeOf(typeof(INPUT));
如果(nSent==0)
{
WriteLine(“SendInput错误”+GetLastError().ToString());
}
}

对不起,雷米,但这段代码没有用。我的测试字符串“M:\test”和“áí”甚至没有命中代码的“else”部分,因为它们都低于0xD800,因此结果与我自己的代码相同。我会保留你的代码以供参考,但我仍然不知所措。@jedcomymullah,我不是
/// <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());
    }
}