FAQ:WinAPI VCPP:сlipboard
Материал из Весельчак У
Как работать с буфером обмена (Clipboard)?
Копирование в буфер обмена.
Алгоритм:
- Готовим данные
- Выделяем память из кучи, вызывая GlobalAlloc()
- Получаем указатель на выделенную память, вызывая GlobalLock()
- Заполняем данные
- Освобождаем указатель, вызывая GlobalUnlock();
- Открываем буфер обмена, вызывая OpenClipboard();
- Очищаем буфер, вызывая EmptyClipboard();
- Вызываем SetClipboardData() один раз для каждого формата вставляемых данных (имеется в виду - если одни и те же данные представлены в разных форматах, и приложение может эти форматы создать)
- Закрываем буфер, вызывая CloseClipboard();
- ВЫЗЫВАТЬ 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();
Извлечение из буфера обмена.
Алгоритм:
- Проверяем, что поддерживается нужный формат данных, вызывая IsClipboardFormatAvailable()
- Открываем буфер обмена, вызывая OpenClipboard();
- Достаём данные
- Получаем из буфера хендл требуемого формата, вызывая GetClipboardData()
- Получаем указатель на выделенную память, вызывая GlobalLock()
- Работаем с данными
- Освобождаем указатель, вызывая GlobalUnlock();
- Закрываем буфер, вызывая 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();