读取 UTF-8 文件,使用 SendInput 将内容传递给其他应用程序

Reading UTF-8 file, passing contents to other application using SendInput

我有一个包含字符“ů”的 utf-8 格式文件,当我使用 ifstream 在 C++ 中读取它并计算它时,输出是“┼»”。我可以通过添加“SetConsoleOutputCP( 65001 );”来解决它,然后我使用“SendInput();”将字符发送到另一个 window。但是因为 SetConsoleOutput() 不影响 SendInput(),应用程序接收到损坏的字符“┼»”。 问题是如何SendInput()重音字符?

        ifstream file(path);
        string str;
        while (getline (file, str)) 
        {
            cout << endl << str <<endl;
            for (char &c : str) {
                INPUT ip;
                ip.type = INPUT_KEYBOARD;
                ip.ki.wScan = 0;
                ip.ki.time = 0;
                ip.ki.dwExtraInfo = 0;
                ip.ki.dwFlags = KEYEVENTF_UNICODE;
                if (isupper(c)) {
                    ip.ki.wVk = VK_LSHIFT;
                    SendInput(1, &ip, sizeof(INPUT));
                } else {
                    ip.ki.dwFlags = KEYEVENTF_KEYUP;
                    ip.ki.wVk = VK_LSHIFT;
                    SendInput(1, &ip, sizeof(INPUT));
                    ip.ki.dwFlags = KEYEVENTF_UNICODE;
                } 
                ip.ki.wVk = VkKeyScanA(c);
                SendInput(1, &ip, sizeof(INPUT));
                Sleep(100);
            }
            INPUT enter;
            enter.type = INPUT_KEYBOARD;
            enter.ki.wScan = 0;
            enter.ki.time = 0;
            enter.ki.dwExtraInfo = 0;
            enter.ki.dwFlags = 0;
            enter.ki.wVk = VK_RETURN;
            SendInput(1, &enter, sizeof(INPUT));
            cout << "enter pressed";
        }
  1. UTF-8 和 Windows 不是好朋友。几乎所有你要用 Windows 做的事情都需要 UTF-16。您需要将 UTF-8 字符串转换为 UTF-16。在 Windows 上,那将是“wstring”,但您应该使用正确的转换例程。唉,C++ 标准现在懒得给你一个可用的标准,所以 Windows-specific MultiByteToWideChar 似乎是个不错的选择。

  2.  ip.ki.dwFlags = KEYEVENTF_UNICODE;
     if (isupper(c)) {
                 ip.ki.wVk = VK_LSHIFT;
    

    这样不行。

    If the dwFlags member specifies KEYEVENTF_UNICODE, wVk must be 0.

    Unicode 字符不能与 Shift 或其他修饰符组合使用。它们不是键码,它们是字符。 Aa 是不同的字符,不需要发送shift键来区分它们。你也不需要VkKeyScanA,因为你要发送Unicode字符,而不是扫描码。

您需要先将 UTF-8 数据转换为 UTF-16,例如使用 MultiByteToWideChar() 或等价物,然后您可以使用KEYEVENTF_UNICODE 标志。有关使用 SendInput().

发送 UTF-16 字符串的示例,请参阅 to