Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11656
Последний выпуск: 19.06.2015

Буфер обмена


Александр Бельбаков, HiProg.com "Технологии программирования"

Введение

Буфер обмена - это набор функций и сообщений, который позволяет приложениям сохранять в памяти данные и передавать их между разными приложениями. Объект в буфере обмена может быть представлен в любом формате данных, называемом форматом буфера обмена. Каждый формат определён целым значением. Для стандартных форматов буфера обмена эти значения являются константами, определёнными в Win32 API.

Зарегистрированные форматы

Множество приложений работает с данными, которые не могут быть переданы в стандартных форматах буфера обмена без потери информации. Во избежание этого программы создают свой собственный формат. Стандартные (предопределённые) форматы называются зарегистрированными форматами буфера обмена. Например, если приложение копирует форматированный текст в буфер обмена, используя текстовый формат, то информация о форматировании будет потеряна. Решением проблемы будет создание (реистрация) нового формата, такого как Rich Text Format (RTF).

Для регистрации нового формата буфера обмена используйте функцию RegisterClipboardFormat. Эта функция присваивает новому формату целое числовое значение, которое представляет этот формат. Чтобы получить имя зарегистрированного формата буфера обмена, передайте его номер функции GetClipboardFormatName.

Если более чем одно приложение регистрирует формат буфера обмена с одинаковым именем, вызовы функции RegisterClipboardFormat будут возвращать одинаковое значение. Список стандартных форматов смотрите в описании функци SetClipboardData.

Частные форматы

Либое приложение может создать частный формат буфера обмена, указав значения в промежутке от CF_PRIVATEFIRST до CF_PRIVATELAST. Указатели данных, ассоциированные с частным форматом автоматически освобождаются системой. Приложение, которое использует частные форматы, может применить сообщение WM_DESTROYCLIPBOARD, чтобы освободить ресурсы системы, когда данные в буфере обмена больше не требуются.

Множество форматов

Приложение может поместить более чем один объект в буфер обмена, каждый соответствующий по информации, но находящийся в разных форматах. Когда приложение помещает информацию в буфер обмена, оно должно обеспечить как можно больше форматов. Чтобы узнать сколько в буфере обмена в данный момент используется форматов, вызовите функцию CountClipboardFormats. Приложение, использующее информацию из буфера обмена, обычно, получает её в наиболее подходящем для себя фомате.

Например, предположим, что пользователь копирует форматированный текст из текстового редактора (WordPad). Приложение первым поместит данные в наиболее подходящем формате (RTF), а затем в обычном текстовом формате (CF_TEXT). Когда же содержимое буфера обмена вставляется в другое приложение (Notepad - обычный текстовый редактор), оно получит данные в наиболее подходящем формате для себя (в случаее с Notepad - текстовом формате, если это Microsoft Word, то в формате RTF).

Оперции с буфером обмена

Приложение должно использовать буфер обмена при вырезки (Cut), копировании (Copy) или вставке данных (Paste). Приложение помещает данные в буфер обмена при операциях Copy и Cut, а получает данные из буфера обмена для оперции Paste.

Чтобы поместить или получить данные из буфера обмена, сначала надо его открыть, используя функцию OpenClipboard. Только одно приложение (точнее окно) может работать с буфером обмена, когда он открыт. Чтобы найти окно, работающее с буфером обмена, вызовите функцию GetOpenClipboardWindow. После того, как приложение закончит работу с буфером обмена, оно должно закрыть его, вызвав функцию CloseClipboard.

Операции Cut и Copy

Чтобы поместить информацию в буфер обмена, сначала окно должно очистить предыдущее его содержание, используя функцию EmptyClipboard. Эта функция посылает сообщение WM_DESTROYCLIPBOARD предыдущему владельцу буфера обмена, освобождает ресурсы и назначает владельцем окно, которое открыло буфер обмена. Чтобы узнать какое окно является владельцем буфера обмена, используйте функцию GetClipboardOwner.

После очистки буфера обмена окно помещает в него как можно больше форматов данных. Для каждого формата окно вызывает функцию SetClipboardData, указывая идентификатор формата и указатель памяти (на данные). Указатель памяти может быть равен NULL, означая то, что окно выдаст данные только при запросе.

Операция Paste

Для получения информации из буфера обмена, сначала окно определяет формат информации. Обычно, окно перечисляет доступные форматы, используя функцию EnumClipboardFormats. В альтернативном случае также можно использовать функцию GrtPriorityClipboardFormat, которая укажит наиболее подходящие форматы по их приоритету. Окно, поддерживающее только один формат может использовать функцию IsClipboardFormatAvailable, которая определит, доступен ли указанный формат данных в буфере обмена.

После определения формата данных буфера обмена окно вызывает функцию GetClipboardData. Эта функция возвращает указатель объекта в памяти, который содержит необходимые данные.

Память и буфер обмена

Под объект в памяти, который должен быть размещён в буфере обмена должен быть выделен блок этой памяти, используйте функцию GlobalAlloc с константами GMEM_DDESHARE и GMEM_MOVEABLE. А для получения данных из памяти используйте функцию CopyMemory.

Clipboard Viewers

Clipboard Viewer - это приложение, которое показывает содержимое буфера обмена в данный момент. По соглашению Clipboard Viewer не влияет на содержимое буфера обмена (не изменяет данные). Обычно, Clipboard Viewer может показывать по крайней мере 3 общих формата: CF_TEXT, CF_BITMAP и CF_METAFILEPICT.

Приложение должно добавить себя в цепочку обозревателей буфера обмена, вызвав функцию SetClipboardViewer. Возвращаемое значние - указатель следующего окна в этой цепочке. Чтобы получить указатель первого окна цепочки используйте функцию GetClipboardViewer. Каждый раз, когда содержимое буфера обмена меняется, система отправляет сообщение WM_DRAWCLIPBOARD первому окну цепочки, затем это окно должно отправить это же сообщение следующему, и т.д. Перед завершением работы Clipboard Viewer должен удалить себя из цепочки обозревателей буфера обмена, вызвав функцию ChangeClipboardChain.

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
95K
19 марта 2015 года
Александр Алексеев
0 / / 19.03.2015
+1 / -1
Мне нравитсяМне не нравится
19 марта 2015, 16:21:38
Спасибо, понятно разжёвано. А вот какая программа лучше всех подходит для работы с историей буфера обмена. Сам использую AAP Assistant, но может кто что получше порекомендует?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог