Вставка после SetClipboardData () в C ++ не включает переводы строк для Блокнота - PullRequest
0 голосов
/ 11 июня 2019

Я занимаюсь разработкой программного обеспечения, которое копирует большую строку в буфер обмена Windows для вставки в другое программное обеспечение. Вставка в другое программное обеспечение не работает, и когда я вставляю в Блокнот, новые строки в исходных строках исчезают, поэтому он не может быть вставлен в другое программное обеспечение. Я знаю это, потому что когда я снова добавляю символы новой строки в Блокнот и выполняю Копирование, Вставка затем работает в другой программе. Когда я вставляю в Wordpad, новые строки появляются загадочно.

Я использую SetClipboardData () в C ++ с типом формата буфера обмена CF_TEXT. Я пытался использовать CF_OEMTEXT, CF_DSPTEXT, но ни один из них не работает. Я видел некоторую документацию по CF_SYLK (символическая ссылка) для электронных таблиц, поскольку программное обеспечение, в которое я вставляю, похоже на электронную таблицу, но я также не мог заставить это работать. Ниже мой код для копирования в буфер обмена.

void ClipBoardManager::CopyExcelStringToClipBoard(std::string excel_str)
{
    OpenClipboard(nullptr);
    EmptyClipboard();
    HGLOBAL hg = GlobalAlloc(GMEM_MOVEABLE, excel_str.size() + 1);
    if (!hg) {
        CloseClipboard();
        return;
    }
    memcpy(GlobalLock(hg), excel_str.c_str(), excel_str.size() + 1);
    GlobalUnlock(hg);
    SetClipboardData(CF_TEXT, hg);
    CloseClipboard();
    GlobalFree(hg);

}

Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 11 июня 2019

Если ваш проект настроен на символы юникода (настройка по умолчанию) - везде используйте юникод и используйте CF_UNICODETEXT вместо CF_TEXT.Или используйте не Unicode - но последовательно - и затем измените настройки проекта.Приведенный ниже код будет правильно копировать текст с окончаниями строк - после завершения этой программы можно вставить скопированный этой программой текст (с окончаниями строк) из буфера обмена, скажем, в блокноте:

#include <Windows.h>

BOOL WINAPI ToClipboard(VOID);

int main()
{
    ToClipboard();
}

BOOL WINAPI ToClipboard(VOID)
{
  LPTSTR  lptstrCopy;
  HGLOBAL hglbCopy;

  if (!OpenClipboard(NULL))
      return FALSE;
  EmptyClipboard();

  // Allocate a global memory object for the text. 
  wchar_t s[] = L"12345\n6789";
  hglbCopy = GlobalAlloc(GMEM_MOVEABLE,
      (wcslen(s) + 1) * sizeof(wchar_t));
  if (hglbCopy == NULL)
  {
      CloseClipboard();
      return FALSE;
  }

  lptstrCopy = (LPTSTR)GlobalLock(hglbCopy);
  memcpy(lptstrCopy, &s,
    (wcslen(s) + 1) * sizeof(wchar_t));
  lptstrCopy[sizeof(s)] = (TCHAR)0;    // null character 
  GlobalUnlock(hglbCopy);

  SetClipboardData(CF_UNICODETEXT, hglbCopy);

  CloseClipboard();

  return TRUE;
}
0 голосов
/ 11 июня 2019

excel_str должен иметь окончания строки CRLF.Вот пример кода для преобразования строки в хороший формат:

string replaceAll(string in, string replaceIn, string replaceOut)
{
    size_t pos = 0;
    while(pos < in.size())
    {
        size_t pos2 = in.find(replaceIn, pos);
        if(pos2 != string::npos)
        {
            in.replace(in.begin() + pos2, in.begin() + pos2 + replaceIn.size(), replaceOut);
            pos = pos2 + replaceOut.size();
        }
        else
            break;
    }
    return in;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...