读取 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 或其他修饰符组合。它们不是关键代码,它们是字符。 A
和 a
是不同的字符,不需要发送 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# 中模拟鼠标输入