Составители:
• В буфере обмена одновременно может находиться только по одному элементу дан-
ных каждого типа. Объясняется это той простой причиной, что не существует спо-
соба разделения нескольких элементов данных одного и того же типа. Однако при
наличии данных нескольких типов приложение, получившее доступ к буферу обме-
на, может запросить только один элемент, несколько элементов или все элементы. В
этом случае данные каждого типа должны запрашиваться отдельно.
Буфер обмена может многократно открываться для запроса других элементов дан-
ных или повторного запроса того же элемента. Но в целом, запрашивая фрагмент дан-
ных из буфера обмена, лучше всего создать его локальную копию, а не повторять один и
тот же запрос снова и снова. Кроме того, не забывайте: нет никакой гарантии того, что
при следующем запросе тот же самый элемент данных останется неизменным, посколь-
ку буфер обмена является общедоступным.
8.1.3. Частные форматы буфера обмена
В Windows определено несколько "частных" форматов: CF_DSPTEXT,
CF_DSPBITМАР, CF_DSPMETAFILEPICT и CF_DSPENHMETAFILE. Они соответст-
вуют форматам CF_TEXT, CF_BITMAP, CF_METAFILEPICT и CF_ENHMETAFILE, но
имеют одно принципиальное ограничение: приложения, запрашивающие стандартные
форматы, не смогут получить доступ к специальным форматам буфера обмена. В этой
связи следует сделать несколько замечаний.
• Данные, находящиеся в одном из специальных форматов, предназначаются для об-
мена информацией между двумя экземплярами одного и того же приложения или
между двумя приложениями, специально разработанными для совместной работы.
• В процессе подобного обмена может передаваться служебная информация, напри-
мер о форматировании и/или шрифтах.
Термин частный формат может ввести в заблуждение. Дело в том, что получить
доступ к таковому может любое приложение. Ведь разрабатывались подобные форматы
не в целях безопасности, а лишь для обеспечения закрытого обмена данными через бу-
фер обмена [12].
Хотя два экземпляра одного и того же приложения или два связанных приложения
должны понимать свои частные форматы, применение этих форматов вовсе не гаранти-
рует, что данные поступили от другого экземпляра того же приложения или родственно-
го приложения. Иными словами, ничто не мешает использованию одинаковых частных
форматов разными, совершенно не связанными друг с другом программами.
Однако на этот случай предусмотрены специальные меры. Вы можете узнать "ав-
тора" содержимого буфера обмена с помощью функции GetClipboardOwner():
hwndCBOwner = GetClipboardOwner();
Приложение, вызвавшее функцию EmptyClipboard() для подготовки к копирова-
нию данных, становится новым владельцем буфера обмена. Другие приложения, обра-
щающиеся к буферу для чтения информации, его владельцами не являются - они просто
получают доступ. Таким образом, за содержимое буфера обмена ответственность несет
только его владелец. Приложение не может записать данные в буфер обмена, не став
сначала его владельцем и не удалив его предыдущее содержимое. Поэтому любое при-
ложение, получившее доступ к информации в частном формате, может также опреде-
лить принадлежность буфера обмена.
Хотя функция GetClipboardOwner() возвращает дескриптор, указывающий на вла-
дельца буфера обмена, сам по себе этот дескриптор ни о чем не говорит. Но имея деск-
риптор, имя класса приложения можно запросить с помощью другой функции:
171
• В буфере обмена одновременно может находиться только по одному элементу дан-
ных каждого типа. Объясняется это той простой причиной, что не существует спо-
соба разделения нескольких элементов данных одного и того же типа. Однако при
наличии данных нескольких типов приложение, получившее доступ к буферу обме-
на, может запросить только один элемент, несколько элементов или все элементы. В
этом случае данные каждого типа должны запрашиваться отдельно.
Буфер обмена может многократно открываться для запроса других элементов дан-
ных или повторного запроса того же элемента. Но в целом, запрашивая фрагмент дан-
ных из буфера обмена, лучше всего создать его локальную копию, а не повторять один и
тот же запрос снова и снова. Кроме того, не забывайте: нет никакой гарантии того, что
при следующем запросе тот же самый элемент данных останется неизменным, посколь-
ку буфер обмена является общедоступным.
8.1.3. Частные форматы буфера обмена
В Windows определено несколько "частных" форматов: CF_DSPTEXT,
CF_DSPBITМАР, CF_DSPMETAFILEPICT и CF_DSPENHMETAFILE. Они соответст-
вуют форматам CF_TEXT, CF_BITMAP, CF_METAFILEPICT и CF_ENHMETAFILE, но
имеют одно принципиальное ограничение: приложения, запрашивающие стандартные
форматы, не смогут получить доступ к специальным форматам буфера обмена. В этой
связи следует сделать несколько замечаний.
• Данные, находящиеся в одном из специальных форматов, предназначаются для об-
мена информацией между двумя экземплярами одного и того же приложения или
между двумя приложениями, специально разработанными для совместной работы.
• В процессе подобного обмена может передаваться служебная информация, напри-
мер о форматировании и/или шрифтах.
Термин частный формат может ввести в заблуждение. Дело в том, что получить
доступ к таковому может любое приложение. Ведь разрабатывались подобные форматы
не в целях безопасности, а лишь для обеспечения закрытого обмена данными через бу-
фер обмена [12].
Хотя два экземпляра одного и того же приложения или два связанных приложения
должны понимать свои частные форматы, применение этих форматов вовсе не гаранти-
рует, что данные поступили от другого экземпляра того же приложения или родственно-
го приложения. Иными словами, ничто не мешает использованию одинаковых частных
форматов разными, совершенно не связанными друг с другом программами.
Однако на этот случай предусмотрены специальные меры. Вы можете узнать "ав-
тора" содержимого буфера обмена с помощью функции GetClipboardOwner():
hwndCBOwner = GetClipboardOwner();
Приложение, вызвавшее функцию EmptyClipboard() для подготовки к копирова-
нию данных, становится новым владельцем буфера обмена. Другие приложения, обра-
щающиеся к буферу для чтения информации, его владельцами не являются - они просто
получают доступ. Таким образом, за содержимое буфера обмена ответственность несет
только его владелец. Приложение не может записать данные в буфер обмена, не став
сначала его владельцем и не удалив его предыдущее содержимое. Поэтому любое при-
ложение, получившее доступ к информации в частном формате, может также опреде-
лить принадлежность буфера обмена.
Хотя функция GetClipboardOwner() возвращает дескриптор, указывающий на вла-
дельца буфера обмена, сам по себе этот дескриптор ни о чем не говорит. Но имея деск-
риптор, имя класса приложения можно запросить с помощью другой функции:
171
Страницы
- « первая
- ‹ предыдущая
- …
- 167
- 168
- 169
- 170
- 171
- …
- следующая ›
- последняя »
