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



我有一个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";
}
  1. UTF-8和Windows不是好朋友。你要用Windows做的几乎所有事情都需要UTF-16。您需要将UTF-8字符串转换为UTF-16。在Windows上;wstring";,但是你应该使用正确的转换程序。遗憾的是,C++标准现在无法为您提供一个有效的标准,因此Windows特定的MultiByteToWideChar似乎是一个不错的选择。

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

    这样不行。

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

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

您需要首先将UTF-8数据转换为UTF-16,例如使用MultiByteToWideChar()或等效代码,然后可以使用KEYEVENTF_UNICODE标志将单个UTF-16代码单元传递给SendInput()。有关使用SendInput()发送UTF-16字符串的示例,请参阅我对使用SendInput发送两个或多个字符的回答。

相关内容

最新更新