Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.01.2012, 03:41   #1
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию буфер обмена Clipboar

Интересуют две вещи:
1. Скопировал в буфер обмена строку (допустим, из блокнота).
Как узнать количество байт имеется в буфере обмена? Что бы заранее зарезервировать память.

2. Скопировал в буфер обмена строку (допустим, из блокнота).
Считал строку из буфера в своём приложении. Все нормально.

Теперь пытаюсь произвести обратную операцию: отправляю строчку в буфер обмена. В блонкоте делаю paste. Английские буковки в порядке. А вот русские - кракозябры. Как это вылечить?

Ниже представлен код:

Код:
void WriteToClipboard(const std::string& crc)
{
    HGLOBAL hGlob;   char * pBuf;
    if ( OpenClipboard((HWND)NULL)!=0 ) {  /*ошибка*/  }
    EmptyClipboard();

    hGlob = GlobalAlloc(GMEM_MOVEABLE, crc.size() + 1);
    if ( hGlob == NULL )   { CloseClipboard(); /*ошибка*/  }

    pBuf = (char*)GlobalLock(hGlob);  strcpy_s(pBuf, crc.size() + 1, crc.c_str() );
    GlobalUnlock(hGlob); SetClipboardData(CF_TEXT, hGlob); CloseClipboard();
}

std::string ReadFromClipboard()
{
    HGLOBAL hGlob; char * pBuf; const size_t maxCount = 3; 

    if ( OpenClipboard((HWND)NULL)!=0 ) {  /*ошибка*/  }
    hGlob= GetClipboardData(CF_TEXT);  pBuf = (char*)GlobalLock(hGlob);  
    
    std::string buf; while( (buf += *pBuf++, *pBuf) != '\0') {} //здесь, мне не нравится, что изначально буфер не знает, сколько байт он должен принять

    GlobalUnlock(hGlob);  CloseClipboard();   return buf;
}


int main()
{
    std::string dst = "привет мир";
    
    WriteToClipboard(dst);      //в блокноте кописата показывает кракозябры

    dst = ReadFromClipboard();  //читает замечательно
    std::cout<< dst<<std::endl;
}
_Bers вне форума Ответить с цитированием
Старый 31.01.2012, 18:19   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

см GlobalSize.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 31.01.2012, 21:41   #3
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Спасибо, одной проблемой меньше). А с кодировкой что можно сделать?
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Буфер обмена X@OC Общие вопросы по Java, Java SE, Kotlin 1 10.08.2011 14:34
буфер обмена DeDoK Win Api 1 25.10.2010 19:08
Буфер обмена dmitriegorovih Общие вопросы Delphi 13 09.09.2010 12:54
Буфер обмена Dem6 Общие вопросы Delphi 0 14.12.2009 19:09