SendInput不会向某些窗口发送基本的Unicode

时间:2018-05-18 23:50:16

标签: 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>
    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等桌面应用程序中,代码工作正常,但在其他应用程序中,它不适用于简单的英文字母和标点符号。 带有特殊字符的字符串“íáó”明确/普遍地起作用,但像“我的车”这样的字符串则不然。显然,“我的车”中字符的utf-16值很低,小于100; á和í的值分别为225和237。看似肤浅的差异。 任何人都知道如何使用SendInput将常规英文字母作为Unicode发送到任意窗口?

1 个答案:

答案 0 :(得分:0)

这不是MSDN上的文档,但在使用KEYEVENTF_UNICODE时,如果给定的Unicode代码点需要使用UTF-16代理,则需要发送两个代理而不使用{{1 },然后使用KEYEVENTF_KEYUP发送两个代理。你展示的代码根本不考虑UTF-16代理,它是为每个代理人独立发送/减少输入。两个代理人需要&#34; down&#34;同时,然后&#34; up&#34;在同一时间。

尝试更多类似的内容(基于我在C ++中为同一问题发布的previous answer):

KEYEVENTF_KEYUP