Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Single Post  Topic: Буфер обмена с++ 
Author Message
MVV



PostPosted: Sun Apr 25, 2010 13:49    Post subject: Reply with quote

VadiMGP wrote:
Еще одно, хотя тут голову на отсечение не дам, но насколько я помню нет необходимости сначала проверять CF_UNICODETEXT, а потом CF_OEMTEXT. Эти форматы автоматически конвертируются один в другой и всегда присутствуют вместе. И CF_TEXT тоже.

Это чисто пример работы с несколькими форматами. Одним из них спокойно может оказаться CF_BITMAP, зависит от задачи.

VadiMGP wrote:
Уточнение. Для вызова IsClipboardFormatAvailable не нужно вызывать OpenClipboard. Даже рекомендуется наоборот, сначала убедиться, что есть нужный нам формат, и только в этом случае открывать буфер.

Действительно, так даже лучше. Вначале определяем, есть ли в буфере формат, который нас устроит, а потом открываем буфер:

Code:
   static const UINT desired_formats[]={CF_TEXT, CF_BITMAP}; // перечисляем форматы, которые нам надо обработать
   int fmt=GetPriorityClipboardFormat(&desired_formats, TSIZE(desired_formats)); // возвращает первый подходящий формат из массива, или -1, если не подошел ни один, или 0, если буфер пуст

   if (!fmt) MessageBox(0, "Clipboard is empty.", "Clipboard viewer", MB_ICONINFORMATION);
   else if (fmt<0) MessageBox(0, "Clipboard contains data in unknown format.", "Clipboard viewer", MB_ICONINFORMATION);
   else if (OpenClipboard(0)) {
      if (fmt==CF_TEXT) {
         HANDLE hclip=GetClipboardData(CF_TEXT);
         // обрабатываем текст
         if (hclip) MessageBox(0, (char*)hclip, "Clipboard text (ANSI)", MB_ICONINFORMATION);
      }
      else if (fmt==CF_BITMAP) {
         // обрабатываем картинку
         MessageBox(0, "Clipboard contains bitmap", "Clipboard viewer", MB_ICONINFORMATION);
      }
      CloseClipboard();
   }


А для простого получения текста вполне достаточно такого кода:
Code:
   if (IsClipboardFormatAvailable(CF_TEXT)&&OpenClipboard(0)) {
      HANDLE hclip=GetClipboardData(CF_TEXT);
      if (hclip) MessageBox(0, (char*)hclip, "Clipboard text (ANSI)", MB_ICONINFORMATION);
      CloseClipboard();
   }

Само собой, делать это нужно при получении уведомления WM_DRAWCLIPBOARD. И вместо выдачи сообщения нужно скопировать текст во внутренний буфер, а после закрытия буфера обрабатывать данные.

Вот только рекомендации по проверке до открытия буфера следовало бы засунуть в описание функции открытия буфера в MSDN...


Я так и не понял, в чем дело, но у меня на одном компе указанный выше пример получения текста из буфера при указани 0 в качестве окна работает, на другом - нет. Тупо возвращает нулевой дескриптор, и ошибку 1418. Я уже думаю, может, там она чуяла, что у процесса уже есть окно, и цеплялась к нему?.. Во, нашел причину - почему-то при трассировке кода в Visual Studio 2008, если я ставлю брейкпоинт между вызовами OpenClipboard и GetClipboardData, первая буфер открывает, но последняя возвращает 0! Confused
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
View user's profile Send private message ICQ Number


Powered by phpBB © 2001, 2005 phpBB Group