读取 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";
}
UTF-8 和 Windows 不是好朋友。几乎所有你要用 Windows 做的事情都需要 UTF-16。您需要将 UTF-8 字符串转换为 UTF-16。在 Windows 上,那将是“wstring”,但您应该使用正确的转换例程。唉,C++ 标准现在懒得给你一个可用的标准,所以 Windows-specific MultiByteToWideChar
似乎是个不错的选择。
-
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 或其他修饰符组合使用。它们不是键码,它们是字符。 A
和 a
是不同的字符,不需要发送shift键来区分它们。你也不需要VkKeyScanA
,因为你要发送Unicode字符,而不是扫描码。
您需要先将 UTF-8 数据转换为 UTF-16,例如使用 MultiByteToWideChar()
或等价物,然后您可以使用KEYEVENTF_UNICODE
标志。有关使用 SendInput()
.
发送 UTF-16 字符串的示例,请参阅 to
我有一个包含字符“ů
”的 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";
}
UTF-8 和 Windows 不是好朋友。几乎所有你要用 Windows 做的事情都需要 UTF-16。您需要将 UTF-8 字符串转换为 UTF-16。在 Windows 上,那将是“wstring”,但您应该使用正确的转换例程。唉,C++ 标准现在懒得给你一个可用的标准,所以 Windows-specific
MultiByteToWideChar
似乎是个不错的选择。-
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 或其他修饰符组合使用。它们不是键码,它们是字符。
A
和a
是不同的字符,不需要发送shift键来区分它们。你也不需要VkKeyScanA
,因为你要发送Unicode字符,而不是扫描码。
您需要先将 UTF-8 数据转换为 UTF-16,例如使用 MultiByteToWideChar()
或等价物,然后您可以使用KEYEVENTF_UNICODE
标志。有关使用 SendInput()
.