我有一个utf-8格式的文件,其中包含一个字符'ů
',当我在c++中使用ifstream读取它并对其进行排序时,输出为'┼»
'。我可以通过添加"SetConsoleOutputCP( 65001 );
"来解决它,然后我使用"SendInput();
"将字符发送到另一个窗口。但是,由于SetConsoleOutput((不会影响SendInput((,应用程序收到损坏的字符"┼»
"。问题是如何发送Input((重音字符?
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特定的
MultiByteToWideChar
似乎是一个不错的选择。 ip.ki.dwFlags = KEYEVENTF_UNICODE; if (isupper(c)) { ip.ki.wVk = VK_LSHIFT;
这样不行。
如果dwFlags成员指定KEYEVENTF_UNICODE,则wVk必须为0。
Unicode字符不能与Shift或其他修饰符组合使用。它们不是关键代码,而是字符。
A
和a
是不同的字符,不需要发送移位键来区分它们。您也不需要VkKeyScanA
,因为您希望发送Unicode字符,而不是扫描代码。
您需要首先将UTF-8数据转换为UTF-16,例如使用MultiByteToWideChar()
或等效代码,然后可以使用KEYEVENTF_UNICODE
标志将单个UTF-16代码单元传递给SendInput()
。有关使用SendInput()
发送UTF-16字符串的示例,请参阅我对使用SendInput发送两个或多个字符的回答。