FAQ:WinAPI VCPP:сlipboard

Материал из Весельчак У
Версия от 16:03, 3 октября 2009; RXL (обсуждение | вклад) (Новая: ===Как работать с буфером обмена (Clipboard)?=== '''Копирование в буфер обмена.''' Алгоритм: # Готовим данные #* В...)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Как работать с буфером обмена (Clipboard)?

Копирование в буфер обмена.

Алгоритм:

  1. Готовим данные
    • Выделяем память из кучи, вызывая GlobalAlloc()
    • Получаем указатель на выделенную память, вызывая GlobalLock()
    • Заполняем данные
    • Освобождаем указатель, вызывая GlobalUnlock();
  2. Открываем буфер обмена, вызывая OpenClipboard();
  3. Очищаем буфер, вызывая EmptyClipboard();
  4. Вызываем SetClipboardData() один раз для каждого формата вставляемых данных (имеется в виду - если одни и те же данные представлены в разных форматах, и приложение может эти форматы создать)
  5. Закрываем буфер, вызывая CloseClipboard();
  6. ВЫЗЫВАТЬ GlobalFree() НЕ НУЖНО, в этом случае это предоставлено системе

Скажем, хотим поместить в буфер обмена текст.

// готовим данные
// выделяем из кучи память для данных
HANDLE hglbCopy = GlobalAlloc(GMEM_MOVEABLE,10);
 
if (!hglbCopy)
	return;
 
// получаем указатель
void* lpStr = GlobalLock(hglbCopy);
 
if (!lpStr)
	return;
 
// заполняем данные
strcpy((char*)lpStr, "my text");
 
// освобождаем указатель
GlobalUnlock(hglbCopy);
lpStr = 0;
 
// открываем буфер обмена
OpenClipboard();
// очищаем
EmptyClipboard();
 
// текстовый формат
SetClipboardData(CF_TEXT, hglbCopy);
 
// закрываем буфер
CloseClipboard();

Извлечение из буфера обмена.

Алгоритм:

  1. Проверяем, что поддерживается нужный формат данных, вызывая IsClipboardFormatAvailable()
  2. Открываем буфер обмена, вызывая OpenClipboard();
  3. Достаём данные
    • Получаем из буфера хендл требуемого формата, вызывая GetClipboardData()
    • Получаем указатель на выделенную память, вызывая GlobalLock()
    • Работаем с данными
    • Освобождаем указатель, вызывая GlobalUnlock();
  4. Закрываем буфер, вызывая CloseClipboard();

Скажем, хотим извлечь из буфера обмена текст.

// Проверяем, что поддерживается нужный формат данных,
if (!IsClipboardFormatAvailable(CF_TEXT))
	return;
 
// открываем буфер обмена
OpenClipboard();
 
// достаём данные
 
// текстовый формат
HANDLE hglbCopy = GetClipboardData(CF_TEXT);
 
if (!hglbCopy)
	return;
 
// получаем указатель
void* lpStr = GlobalLock(hglbCopy);
 
if (!lpStr)
	return;
 
// читаем данные
char data[10];
memmove(data, lpStr, sizeof(data));
 
// освобождаем указатель
GlobalUnlock(hglbCopy);
lpStr = 0;
 
// закрываем буфер
CloseClipboard();