MVV

|
Posted: Sun Apr 25, 2010 13:49 Post subject: |
|
|
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!  _________________ TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel… |
|