获取剪贴板-特殊字符

C++ Get Clipboard - special characters

本文关键字:特殊字符 剪贴板 获取      更新时间:2023-10-16

我有一个简单的函数,用于从剪贴板检索文本并将其打印到文件中。它工作得很好,除非在剪贴板上有外文字母。例如,字母"ski"不会被打印出来。下面是省略了一些明显部分的代码:

HANDLE hData = GetClipboardData(CF_UNICODETEXT);
if (hData != NULL)
{
    wchar_t * pszText = static_cast<wchar_t*>(GlobalLock(hData));
    if (pszText != NULL)
    {
        std::wstring text(pszText);
        // Release the lock
        GlobalUnlock(hData);
        // Release the clipboard
        CloseClipboard();
        //myFile is a wofstream.
        myFile << text;
    }
}

What I tried:

  1. 我使用"wcout"以及标准的"cout"来打印变量"text"answers"pszText"。在这两种情况下,特殊的字母都没有打印出来。
  2. 尝试将CF_UNICODETEXT更改为CF_TEXT,结果相同。

TL:DR我有一个获取剪贴板功能,但它不工作与字符,如"ski"或"ki"。


Edit:按照建议,我检查了调试器中的变量。事实证明,变量"wstring text"实际上包含特殊字符,例如:"ń"。问题似乎是写文件。在写入特殊字符之前,是否需要以某种特殊的方式打开文件?下面是我打开文件的方法:

myFile.open(logFullPath, std::ios_base::out | std::ios_base::app);

Edit2: 我现在百分之百肯定问题出在这一行:

//myFile is a wofstream.
myFile << text;

下面的代码是如何处理将unicode字符写入ofstream的上述问题的示例。使用它解决了目前为止我所有的问题。

#include <fstream>
#include <codecvt>
int main() {
    std::wofstream mystream("test.txt");
    mystream.imbue(std::locale(std::locale(),
                   new std::codecvt_utf8_utf16<wchar_t, 0x10ffff, std::codecvt_mode(std::consume_header|std::generate_header)>));
    mystream << "Hello, World!n";
}