FAQ:WinAPI VCPP:сlipboard — различия между версиями
Материал из Весельчак У
RXL (обсуждение | вклад) (Новая: ===Как работать с буфером обмена (Clipboard)?=== '''Копирование в буфер обмена.''' Алгоритм: # Готовим данные #* В...) |
(нет различий)
|
Текущая версия на 16:03, 3 октября 2009
Как работать с буфером обмена (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();