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

Posted

技术标签:

【中文标题】读取 UTF-8 文件,使用 SendInput 将内容传递给其他应用程序【英文标题】:Reading UTF-8 file, passing contents to other application using SendInput 【发布时间】:2020-10-20 09:43:28 【问题描述】:

我有一个 utf-8 格式的文件,其中包含一个字符“ů”,当我在 c++ 中使用 ifstream 读取它并 cout 时,输出为“┼»”。我可以通过添加'SetConsoleOutputCP( 65001 );'来解决它,然后我使用'SendInput();'将字符发送到另一个窗口。但是因为 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";
        

【问题讨论】:

评论不用于扩展讨论;这个对话是moved to chat。 【参考方案1】:

    UTF-8 和 Windows 不是好朋友。几乎所有你要用 Windows 做的事情都需要 UTF-16。您需要将 UTF-8 字符串转换为 UTF-16。在 Windows 上,这将是“wstring”,但您应该使用正确的转换例程。唉,C++ 标准现在无法为您提供一个可以工作的标准,因此特定于 Windows 的 MultiByteToWideChar 似乎是一个不错的选择。

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

    这样不行。

    如果dwFlags成员指定KEYEVENTF_UNICODE,wVk必须为0。

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

【讨论】:

【参考方案2】:

您需要先将 UTF-8 数据转换为 UTF-16,例如使用 MultiByteToWideChar() 或等效的,然后您可以使用 KEYEVENTF_UNICODE 标志将各个 UTF-16 代码单元传递给 SendInput()。有关使用 SendInput() 发送 UTF-16 字符串的示例,请参阅 my answer 到 Sending Two or more chars using SendInput。

【讨论】:

以上是关于读取 UTF-8 文件,使用 SendInput 将内容传递给其他应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何正确使用 SendInput() 在 C# 中模拟鼠标输入

在 Node-FFI 中使用 SendInput

INPUT / vector数组不适用于SendInput

在多显示器环境中计算 SendInput() 的归一化坐标

时间:2019-04-10 标签:c++win32SendInput()

如何在 AutoHotkey 中的 SendInput 命令之间添加延迟?