Что такое код isclipboardformatavailable

Что такое код isclipboardformatavailable

Определяет, содержит ли буфер обмена данные в указанном формате

#include
_ClipBoard_IsFormatAvailable ( $iFormat )

$iFormat Стандартный или зарегистрированный формат буфера обмена
Успех: Возвращает True , буфер обмена содержит данные в указанном формате
Ошибка: Возвращает False , буфер обмена не содержит данные в указанном формате

Func _Main ()
Local $hGUI , $aFormats [ 3 ] = [ 2 , $CF_TEXT , $CF_OEMTEXT ]

; Создаёт GUI
$hGUI = GUICreate ( «Clipboard» , 600 , 400 )
$iMemo = GUICtrlCreateEdit ( «» , 2 , 2 , 596 , 396 , $WS_VSCROLL )
GUICtrlSetFont ( $iMemo , 9 , 400 , 0 , «Courier New» )
GUISetState ()

; Смотрите, если есть ли какой либо текст в буфер обмена
MemoWrite ( «Затребованные форматы .: » & _ClipBoard_GetPriorityFormat ( $aFormats ))
MemoWrite ( «Имеется ли Unicode . » & _ClipBoard_IsFormatAvailable ( $CF_UNICODETEXT ))

; Цикл выполняется, пока окно не будет закрыто
Do
Until GUIGetMsg () = $GUI_EVENT_CLOSE

; Записывает строку в элемент для заметок
Func MemoWrite ( $sMessage = «» )
GUICtrlSetData ( $iMemo , $sMessage & @CRLF , 1 )
EndFunc ;==>MemoWrite

Буфер обмена. Форматы буфера обмена , страница 8

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

int GetPriorityClipboardFormat ( UINT* IpPriorityList, int nCount )

UINT*: Указатель на массив значений UINT. Каждый элемент массива должен содержать номер требуемого формата буфера обмена. Это один из предопределенных форматов, такой как CF_TEXT, либо специальный формат, возвращаемый функциями RegisterClipboardFormat или EnumClipboardFormats. Элементы списка должны следовать в порядке убывания приоритетности.

int: Количество элементов массива, на который указывает IpPriorityList.

int: Формат с наивысшим из доступных приоритетом. Если буфер обмена пуст, функция возвращает значение NULL. Если буфер обмена содержит данные, но они не относятся ни к одному из требуемых форматов, функция возвращает значение -1. Для получения кода ошибки используется функция GetLastError.

RegisterClipboardFormat IsClipboardFormatAvailable, EnumClipboardFormats.

Следующий пример демонстрирует несколько расширенных применений буфера обмена. После запуска программы примера (обрабатывается сообщение WM_CREATE) формат буфера обмена регистрируется. Кроме того, буфер обмена настраивается для воспроизведения с задержкой двух форматов — CF_TEXT и зарегистрированного формата. При воспроизведении с задержкой данные не загружаются в буфер обмена, пока не будут зарегистрированы приложением. После регистрации Windows отправляет сообщение WM_RENDERFORMAT владельцу буфера обмена, который в ответ загружает данные в буфер обмена. Как только сообщение WM_PAINT будет принято, программа выполнит чтение буфера обмена. Она попытается прочитать оба формата буфера обмена. Формат CF_TEXT читается через стандартного протокола буфера обмена. Содержимое этого формата можно отобразить в любой момент. Перед чтением зарегистрированного формата буфера обмена приложение использует функцию GetPriorityClipboardFormat для выявления доступных форматов. В данном случае проверяется список лишь из двух приемлемых форматов. Если зарегистрированный формат доступен, содержимое буфера обмена отображается в клиентской области приложения (см. рис. 18.3).

IsClipboardFormatAvailable Windows 98 • Windows 2000

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

BOOL IsClipboardFormatAvailable ( UINT wFormat )

UINT: Требуемый формат буфера обмена. Это один из предопределенных форматов либо формат, зарегистрированный приложением с помощью функции RegisterClipboardFormat.

BOOL: TRUE, если данные указанного формата доступны в буфере обмена, FALSE в противном случае. Для получения кода ошибки используется функция GetLastError.

См. пример, приведенный в описании функции GetPrioriryClipboardFormat.

Функция OpenClipboard открывает буфер обмена для чтения и записи его содержимого. Буфер обмена должен быть открыт до того, как функция GetClipboardData сможет считывать его содержимое либо функция SetClipboardData сможет устанавливать его содержимое. Буфер обмена остается открытым до вызова функции CloseClipboard. Ни одно приложение не должно возвращать управление Windows, оставляя при этом буфер обмена открытым. Поэтому буфер обмена необходимо открывать и закрывать в течение обработки единственного сообщения Windows.

BOOL OpenClipboard ( HWND h Wnd )

HWND: Дескриптор окна, которое открывает буфер обмена.

BOOL: TRUE, если буфер обмена открыт, и FALSE в случае ошибки (например, если другое приложение оставило буфер обмена открытым). Для получения кода ошибки применяется функция GetLastError.

CloseClipboard, GetClipboardData, SetClipboardData, GetOpenCIipboardWindow

См. пример, приведенный в описании функции ChangeClipboardChain.

RegisterClipboardFormat Windows 98 • Windows 2000

Функция RegisterClipboardFormat регистрирует в Windows имя нового формата буфера обмена. Эта функция применяется для добавления специализированных форматов буфера обмена Windows, которые могут использоваться для взаимодействия между приложениями (когда обе программы распознают формат), а также для приватного взаимодействия между отдельными экземплярами.

UINT RegisterClipboardFormat ( LPCTSTR IpFormatName )

LPCTSTR Указатель на завершаемую нулем строку символов, содержащую имя нового формата.

UINT: Номер формата, используемый системой Windows для его индексации. В случае ошибки возвращается значение NULL. Если формат уже зарегистрирован в Windows, возвращаемое значение соответствует первоначальной регистрации.

См. пример, приведенный в описании функции GetPriorityCHpboardFormat.

Функция SetClipboardData помещает данные в буфер обмена для конкретного формата. Это единственный способ установки содержимого буфера обмена. Прежде чем приложение поместит какие-либо данные в буфер обмена, он должен быть открыт при помощи функции OpenClipboard, а все форматы удалены путем вызова функции EmptyClipboard. Непосредственно после записи данных следует обратиться к функции CloseClipboard.

HANDLE SetClipboardData ( UINT wFormat, HANDLE hMem )

WORD: Задает тип данных, содержащихся в блоке памяти, на который указывает дескриптор hMem. Тип данных может быть любым из перечисленных в табл. 18.1 либо зарегистрированным форматом буфера обмена.

HANDLE: Дескриптор глобального блока памяти, содержащего данные в указанном формате. Для реализации воспроизведения с задержкой параметру hMem необходимо присвоить значение NULL. Это означает, что данные не должны передаваться в буфер обмена до приема сообщения WM_RENDERFORMAT.

HANDLE: Дескриптор данных в буфере обмена, который эти данные заменяет. Обычно это значение не используется.

OpenClipboard, GetClipboardData, EmptyClipboard, CloseClipboard

ПРЕДУПРЕЖДЕНИЕПосле установки данных буфера обмена блок памяти принадлежит Windows. Приложения не должны удалять данные или оставлять блок заблокированным. Приложения, использующие буфер обмена не должны допускать передачу управления Windows, пока буфер обмена открыт. Другими словами, буфер обмена должен открываться и закрываться в течение обработки единственного сообщения Windows.

См. пример, приведенный в описании функции GetPriorityClipboardFormat.

Функция SetClipboardViewer помещает конкретное окно в начало цепочки окон просмотра буфера обмена. Возвращаемое значение (дескриптор следующего окна просмотра в цепочке) должно сохраняться вызывающей процедурой и постоянно обновляться за счет обработки сообщения WM_CHANGECBCHAIN. Дескриптор следующего окна просмотра буфера обмена необходим для обработки сообщений WM_DRAWCLIPBOARD, \VM_CHANGECBCHAIN и WM_DESTROY.

HWND SetClipboardViewer ( HWND hWnd )

HWND: Дескриптор окна, добавляемого к цепочке окон просмотра буфера обмена.

HWND: Дескриптор следующего окна цепочки.

Связанные сообщения WM_DRAWCLIPBOARD, WM_CHANGECHAIN

См. пример, приведенный в описании функции ChangeClipboardChain листинга окна просмотра буфера обмена, в котором обрабатываются текстовые данные и растровое изображение.

ВИДЕОКУРС
выпущен 4 ноября!

Описание:
function IsClipboardFormatAvailable(Format: Word): Bool;

Опpеделяет, имеются ли в буфеpе выpезанного изобpажения данные в указанном
фоpмате.

Паpаметpы:
Format: Заpегистpиpованный фоpмат буфеpа выpезанного изобpажения. Одна из
констант cf_. См. pаздел «Фоpматы буфеpа выpезанного изобpажения, cf_» в главе
1.

Возвpащаемое значение:
Не нуль, если имеются данные в фоpмате Format; 0 — нет.

Буфер в C++

03.12.2011, 17:11

Буфер обмена
Как сделать так что бы программа постоянно проверяла буфер обмена и содержимое буфера добавляла в.

Буфер обмена
Как в билдере скопировать значение из буфера обмена и записать тудаже??

Буфер cin
Не подскажите метод который возвращал бы кол-во байт или символов в буфере cin. Язык c++

Скопировать буфер в строку
вот есть такой код: char *buf = new char; buf=’1′; buf=’2′; buf=0; buf=’4′; .

Скриншот экрана в буфер
Добро всем! Подсобите с переводом с дельфей на С++ procedure SendScreenImageToClipboard; var .

03.12.2011, 18:28 2

Решение

Работа с буфером обмена (clipboard)

Введение.
1. Простейшие приемы работы с буфером обмена.
2. Нестандартные форматы данных буфера обмена.
3. Функции для работы с буфером обмена.
4. Демонстрационное приложение.
5. Ссылки.

Очень часто в программах имеется набор функций для работы с буфером обмена, будь то текстовые редакторы или графические, поскольку с использованием буфера обмена упрощается обмен данными между программами. На форуме часто задают вопросы о том, как поместить изображение или текст в буфер обмена и потом извлечь эти данные, следовательно, в этой статье речь пойдет именно об этом.

1. Простейшие приемы работы с буфером обмена.

Прежде чем поместить в буфер обмена какую-либо информацию, ваша программа (далее просто окно) должна его открыть, используя функцию OpenClipboard. Однако следует учесть тот факт, что одновременно только одно окно может открыть буфер обмена. Следую хорошему тону программирования — если мы что-либо открыли, то нужно и закрыть. Работа с буфером обмена не является исключением для этого правила, следовательно, когда окно закончит работу, оно должно закрыть буфер обмена, вызвав функцию CloseClipboard.
После того как программа открыла буфер обмена, она должна его очистить от предыдущего содержания, для чего следует вызвать функцию EmptyClipboard. В обязанности этой функции входит посылка сообщения WM_DESTROYCLIPBOARD предыдущему владельцу буфера обмена, освобождение ресурсов, связанных с данными в буфере обмена. После этих операций данная функция передает в монопольное использование буфер обмена окну, которое вызвало функцию OpenClipboard.
После того как мы открыли буфер обмена и очистили его, мы имеем полное право помещать в него свои данные в различных форматах, используя функцию SetClipboardData (см. описание функции для описания стандартных форматов данных).
Чтобы извлечь информацию из буфера обмена, окно должно вызвать функцию GetClipboardData.
Данная функция в качестве параметра принимает формат буфера обмена, для того чтобы извлечь данные в этом формате. Если в буфер обмена данные поместила другая программа, вы можете проверить доступные форматы данных перед их непосредственным извлечением, используя функцию IsClipboardFormatAvailable.

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

Пример записи и чтения текста.

Подводя итог этого раздела можно выделить следующие основные шаги для записи и чтения данных при работе с буфером обмена. Для того чтобы записать данные в буфер обмена, вы должны выполнить следующую последовательность действий:

Открыть буфер обмена функцией OpenClipboard
Очистить содержимое буфера обмена функцией EmptyClipboard
Заказать функцией GlobalAlloc глобальный блок памяти, имеющий размер, достаточный для размещения записываемых в буфер обмена данных
Заблокировать полученный блок памяти функцией GlobalLock
Записать в заблокированный блок памяти данные
Разблокировать блок памяти функцией GlobalUnlock
Поместить данные в буфер обмена функцией SetClipboardData
Закрыть буфер обмена функцией CloseClipboard

Илон Маск рекомендует:  skewX() в CSS

Процедура чтения данных из буфера обмена тоже проста. Приложение должно сделать следующее:

Открыть буфер обмена функцией OpenClipboard
Вызвать функцию GetClipboardData
Заблокировать блок памяти, идентификатор которого получен от функции GetClipboardData, функцией GlobalLock
Переписать данные из заблокированного буфера данных Clipboard в буфер, заказанный специально для этого приложением
Разблокировать блок памяти, идентификатор которого получен от функции GetClipboardData, функцией GlobalUnlock
Закрыть буфер обмена функцией CloseClipboard

2. Нестандартные форматы данных буфера обмена.

Возможно ситуация, когда приложению необходимо поместить данные в буфер обмена, а стандартные форматы для этого не подходят. Выходом из такой ситуации является возможность регистрации собственного формата данных.
Для того чтобы зарегистрировать новый формат буфера обмена, используйте функцию RegisterClipboardFormat. Рассмотрим простой пример использования этой функции:

Два различных приложения или две копии одного приложения могут зарегистрировать формат с одним и тем же именем, при этом функция RegisterClipboardFormat вернет один и тот же идентификатор формата. Поэтому два приложения всегда смогут «договориться», если они знают имя нестандартного формата данных.

3. Функции для работы с буфером обмена.

Данная функция удаляет определяемое окно просмотра буфера обмена из цепочки окон просмотра буфера обмена. Что это значит? А значит это следующее: чтобы получать сообщения от буфера обмена, наша программа должна заявить операционной системе об этом, вызвав функцию SetClipboardViewer , и если вдруг настанет такой момент, когда мы больше не хотим получать сообщения от буфера обмена (например: закрытие приложения), мы должны вызвать данную функцию.

В качестве параметров данная функция принимает дескрипторы окон: hWndRemove — идентифицирует окно, которое будет удалено из цепочки; hWndNewNext — дескриптор окна, которое следует за hWndRemove окном в цепочке окон просмотра буфера обмена, т.е. дескриптор, возвращенный ранее функцией SetClipboardViewer.
После вызова данной функции, всем окнам в цепочке окон просмотра буфера обмена будет послано сообщение WM_CHANGECBCHAIN. Обработав данное сообщение окно обычно возвращает FALSE, следовательно, данная функция обычно будет возвращать FALSE. Однако если имеется только одно окно в цепочке, возвращаемое значение — обычно TRUE.
Следует также отметить, что окно, идентифицированное как hWndNewNext, заменяет hWndRemove окно в цепочке.

Данная функция закрывает буфер обмена.

Данная функция не имеет входных параметров. В случае успешного завершения возвращаемое значение будет отлично от нуля, в противном случае — ноль. Для более подробной информации об ошибке следует вызвать функцию GetLastError.
Слудеут отметить, что окно должно всегда вызывать данную функцию после окончания работы с буфером обмена. Если этого не сделать, другие окна не будут иметь доступ к буферу обмена, что не очень хорошо. Также следует учесть, что после вызова этой функции не следует помещать данные в буфер обмена.

Данная функция возвращает число различных форматов данных в текущем буфере обмена.

Данная функция не имеет входных параметров. В случае успешного завершения функции, возвращаемое значение — это число различных форматов данных в текущем буфере обмена, в противном случае — ноль. Для более подробной информации об ошибке следует вызвать функцию GetLastError.

Данная функция очищает буфер обмена и освобождает дескрипторы данных в нем. Затем функция назначает монопольное использование буфера обмена окну, которое вызвало функцию OpenClipboard.

Данная функция не имеет входных параметров. В случае успешного завершения возвращаемое значение будет отлично от нуля, в противном случае — ноль. Для более подробной информации об ошибке следует вызвать функцию GetLastError.
Следует отметить, что перед вызовом данной функции, прикладная программа должна открыть буфер обмена, используя функцию OpenClipboard. Если приложение при открытии буфера обмена определяет дескриптор окна NULL, EmptyClipboard завершается успешно, но устанавливает владельца буфера обмена как NULL.

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

Данная функция извлекает данные из буфера обмена в заданном формате. Предварительно необходимо открыть буфер обмена.

В качестве параметра uFormat функция принимает идентификатор формата, данные в котором необходимо извлечь из буфера обмена.
В случае успешного завершения данной функции, возвращаемое значение — дескриптор объекта буфера обмена в заданном формате, в противном случае — возвращаемое значение NULL. Чтобы получить дополнительные данные об ошибке, вызовите функцию GetLastError.
Следует отметить, что при вызове данной функции операционная система выполнит скрытое преобразование форматов данных.

Таблица преобразования форматов:

Формат Буфера обмена Формат преобразования Платформа поддержки

CF_BITMAP CF_DIB Windows NT/2000, Windows 95/98
CF_BITMAP CF_DIBV5 Windows 2000
CF_DIB CF_BITMAP Windows NT/2000, Windows 95/98
CF_DIB CF_PALETTE Windows NT/2000, Windows 95/98
CF_DIB CF_DIBV5 Windows 2000
CF_DIBV5 CF_BITMAP Windows 2000
CF_DIBV5 CF_DIB Windows 2000
CF_DIBV5 CF_PALETTE Windows 2000
CF_ENHMETAFILE CF_METAFILEPICT Windows NT/2000, Windows 95/98
CF_METAFILEPICT CF_ENHMETAFILE Windows NT/2000, Windows 95/98
CF_OEMTEXT CF_TEXT Windows NT/2000, Windows 95/98
CF_OEMTEXT CF_UNICODETEXT Windows NT/2000
CF_TEXT CF_OEMTEXT Windows NT/2000, Windows 95/98
CF_TEXT CF_UNICODETEXT Windows NT/2000
CF_UNICODETEXT CF_OEMTEXT Windows NT/2000
CF_UNICODETEXT CF_TEXT Windows NT/2000

Данная функция извлекает из буфера обмена имя заданного зарегистрированного формата. Функция копирует имя в заданный буфер.

В качестве входных параметров данная функция получает идентификатор формата данных буфера обмена (format), адрес буфера для названия формата (lpszFormatName) и длину буфера (cchMaxCount). Идентификатор формата lpszFormatName определяет тип формата, название которого будет извлечено. Этот параметр не должен определять какой-либо из предопределенных форматов буфера обмена. lpszFormatName — указывает на буфер, который должен принять имя формата; cchMaxCount — определяет максимальную длину строки (в символах), которая будет скопирована в буфер. Следует учесть, что если имя превышает это ограничение, оно усекается.
В случае успешного завершения, возвращаемое значение — длина строки (в символах), скопированной в буфер, в противном случае, возвращаемое значение равно 0, указывая, что запрошенный формат не существует или предопределен. Чтобы получать дополнительные данные об ошибке, вызовите функцию GetLastError.

Данная функция извлекает дескриптор окна текущего владельца буфера обмена.

Данная функция не имеет входных параметров. В случае успешного завершения, возвращаемое значение — дескриптор окна, которое является в данный момент владельцем буфера обмена. В противном случае, возвращаемое значение NULL. Чтобы получить дополнительные данные об ошибке, вызовите функцию GetLastError.

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

Данная функция извлекает дескриптор первого окна в цепочке окон просмотра буфера обмена.

Данная функция не имеет входных параметров. В случае успешного завершения, возвращаемое значение — дескриптор первого окна в цепочке окон просмотра буфера обмена. Если же не определено ни одно окно просмотра буфера обмена, возвращаемое значение NULL. Чтобы получить дополнительные данные об ошибке, вызовите функцию GetLastError.

Данная функция извлекает дескриптор окна, которое в настоящее время имеет открытый буфер обмена.

Данная функция не имеет входных параметров. В случае успешного завершения, возвращаемое значение — дескриптор окна, которое имеет открытый буфер обмена. Если нет окна, которое открыло буфера обмена, возвращаемое значение NULL, т.е. если открыть буфер обмена и не передать в функцию OpenClipboard дескриптор окна, бефер будет открыт, но не связан с каким-либо окном. В таком случае данная функция вернет NULL. Чтобы получить дополнительные данные об ошибке, вызовите функцию GetLastError.

Данная функция возвращает значение первого доступного формата буфера обмена в заданном списке.

В качестве входных параметров данная функция принимает массив целых чисел без знака, идентифицирующих форматы буфера обмена (paFormatPriorityList) и число введенных данных в массиве paFormatPriorityList (cFormats). Следует учесть, что cFormats не должно быть больше, чем число вводимых данных в списке.
В случае успешного завершения, возвращаемое значение — первый формат буфера обмена в списке, для которого данные являются доступными. Данная функция вернет NULL, если буфер обмена пуст, или -1 (-1) — если буфер обмена содержит данные, но не в каком-либо из заданных форматов. Чтобы получить дополнительные данные об ошибке, вызовите функцию GetLastError.

Функция IsClipboardFormatAvailable:

Данная функция определяет, содержит ли буфер обмена данные в заданном формате.

В качестве входного параметра данной функции является идентификатор формата данных (format).
Если формат буфера обмена доступен, возвращаемое значение не 0, в противном случае функция вернет 0. Чтобы получить дополнительные данные об ошибке, вызовите функцию GetLastError.
В качестве совета могу сказать, что всегда следует использовать данную функцию перед извлечением данных из буфера обмена, дабы избежать ошибок.

Данная функция открывает буфер обмена для работы с ним и препятствует другим прикладным программам изменять содержимое буфера обмена.

BOOL OpenClipboard
(
HWND hWndNewOwner // дескриптор окна, открывшего буфер обмена
);

В качестве входных параметров данная функция принимает дескриптор окна (hWndNewOwner). Этот дескриптор идентифицирует окно, которое будет связано с открытым буфером обмена. Однако можно не задавать этот дескриптор, в таком случае, открытый буфер обмена будет связан с текущей задачей.
В случае успешного завершения данной функции, возвращается значение отличное от 0, в противном случае, возвращаемое значение 0. Чтобы получить дополнительные данные об ошибках, обратитесь к функции GetLastError.
Следует учесть, что если другая программа открыла буфер обмена для работы с ним, данная функция завершится с ошибкой. Важным моментом является то, что окно, идентифицированное параметром hWndNewOwner, не станет владельцем буфера обмена, если не было обращения к функции EmptyClipboard.

Данная функция регистрирует новый формат буфера обмена, который можно будет использовать в дальнейшем для работы.

В качестве входного параметра этой функции (lpszFormat) служит адрес строки, которая именует новый формат.
В случае успешного завершения, возвращаемое значение идентифицирует зарегистрированный формат буфера обмена, в противном случае функция возвращает 0. Чтобы получать дополнительные данные об ошибке, вызовите функцию GetLastError.
Следует учесть, что если формат данных с заданным именем уже существует, новый формат не регистрируется, а возвращаемое значение идентифицирует существующий формат. Это дает возможность больше чем одной прикладной программе работать с буфером обмена, используя тот же самый зарегистрированный формат буфера обмена. Обратите внимание, что сравнение названия формата осуществляется без учета регистра.

Данная функция помещает данные в буфер обмена в заданном формате.

В качестве входных параметров данная функция принимает формат буфера обмена (uFormat) и дескриптор данных (hMem). В качестве формата буфера обмена функция может принимать любой из зарегистрированных или стандартных форматов буфера обмена; hMem — идентифицирует данные в заданном формате.
В случае успешного завершения, возвращаемое значение — дескриптор данных, в противном случае — NULL. Чтобы получить дополнительные данные об ошибке, вызовите функцию GetLastError.

Ниже приведен список стандартных форматов данных буфера обмена с описанием, которые может принимать uFormat:

CF_BITMAP — Дескриптор к точечному рисунку (HBITMAP).
CF_DIB — Объект в памяти содержит структуру BITMAPINFO, сопровождаемую растровыми битами.
CF_DIF — Формат обмена данными программы Arts’.
CF_DSPBITMAP — Растровый формат отображения данных на дисплее, связанный с собственным форматом. Параметр hMem должен быть дескриптором данных, которые могут отображаться в растровом формате вместо частным образом форматируемых данных.
CF_DSPENHMETAFILE — Формат отображения улучшенного метафайла связанного с собственным форматом. Параметр hMem должен быть дескриптор данных, которые могут отображаться в улучшеннном формате метафайла вместо частным образом форматируемых данных.
CF_DSPMETAFILEPICT — Формат отображения данных метафайла-картинки, связанного с собственным форматом. Параметр hMem должен быть дескриптором данных, которые могут отображаться в формате метафайла-картинки вместо частным образом форматируемых данных.
CF_DSPTEXT — Формат отображения текста, связанный с собственным форматом. Параметр hMem должен быть дескриптором данных, которые могут отображаться в текстовом формате вместо частным образом форматируемых данных.
CF_ENHMETAFILE — Дескриптор улучшенного метафайла (HENHMETAFILE).
От CF_GDIOBJFIRST до CF_GDIOBJLAST — Диапазон целочисленных значений для определяемых программой форматов буфера обмена объекта GDI. Дескрипторы, связанные с форматами буфера обмена в этом диапазоне автоматически не удаляются, при использовании функции GlobalFree, когда очищается буфер обмена. Также, при использовании значений в этом диапазоне, параметр hMem — не дескриптор к объекту GDI, а дескриптор, помещенный функцией GlobalAlloc с флажками GMEM_MOVEABLE и GMEM_DDESHARE.
CF_HDROP — Дескриптор типа HDROP — это тот, который идентифицирует список файлов. Прикладная программа может извлечь информацию о файлах, передавая дескриптор функции DragQueryFile.
CF_LOCALE — Данные являются дескриптором локального идентификатора, связанного с текстом в буфере обмена. Когда вы закрываете буфер обмена, если он содержит данные CF_TEXT, а не данные CF_LOCALE, система автоматически устанавливает формат CF_LOCALE в текущем месте ввода информации. Вы можете использовать формат CF_LOCALE, чтобы сопоставлять различные места действия с текстом буфера обмена. Прикладная программа, которая вставляет текст из буфера обмена, может извлечь этот формат, чтобы определить, какой набор символов использовался, чтобы создать текст. Обратите внимание, что буфер обмена не поддерживает обычный текст в многокомпонентных наборах символов. Чтобы добиться этого, взамен используйте форматированный текстовый тип данных, такой как RTF. Windows NT: система использует кодовую страницу, связанную с CF_LOCALE, чтобы неявно преобразовать из CF_TEXT в CF_UNICODETEXT. Следовательно, правильная таблица кодовой страницы используется для преобразования.
CF_METAFILEPICT — Дескриптор метафайла изображает формат как определено структурой METAFILEPICT. При передаче дескриптора CF_METAFILEPICT посредством динамического обмена данными (прямой ввод данных (DDE)), прикладная программа, ответственная за удаление hMem должна также освободить метафайл, упоминаемый дескриптором CF_METAFILEPICT.
CF_OEMTEXT — Текстовый формат, содержащий символы в OEM наборе символов. Каждые строка заканчивается комбинацией возврат каретки / перевод строки (carriage return/linefeed)(CR-LF). Символ пробела сообщает о конце данных.
CF_OWNERDISPLAY — Собственный формат отображения данных. Владелец буфера обмена должен отображать, и модифицировать окна просмотра буфера обмена, и принимать сообщения WM_ASKCBFORMATNAME, WM_HSCROLLCLIPBOARD, WM_PAINTCLIPBOARD, WM_SIZECLIPBOARD и WM_VSCROLLCLIPBOARD. Параметр hMem должен иметь значение NULL.
CF_PALETTE — Дескриптор цветовой палитры. Всякий раз, когда прикладная программа помещает данные в буфер обмена, которые зависят от цветовой палитры или назначает цветовую палитру, она должна поместить в буфер обмена также и палитру. Если буфер обмена содержит данные в формате CF_PALETTE (логическая цветовая палитра), прикладная программа должна использовать функции SelectPalette и RealizePalette, чтобы реализовать (сравнить) любые другие данные в буфере обмена в зависимости от этой логической палитры. При отображении данных буфера обмена, буфер обмена Windows всегда использует как свою текущую палитру любого объекта в буфере обмена, который находится в формате CF_PALETTE.
CF_PENDATA — Дополнительные данные для пера в Microsoft Windows для Pen Computing (Компьютерного пера).
От CF_PRIVATEFIRST до CF_PRIVATELAST — Диапазон целых значений для собственных форматов буфера обмена. Дескрипторы, связанные с собственными форматами буфера обмена автоматически не освобождаются; владелец буфера обмена должен освобождать такие дескрипторы, обычно в ответ на сообщение WM_DESTROYCLIPBOARD.
CF_RIFF — Представляет звуковые данные более сложные, чем они могут быть представлены в стандартном звуковом формате CF_WAVE.
CF_SYLK — Формат Символической Связи Microsoft (SYLK) (Microsoft Symbolic Link).
CF_TEXT — Текстовый формат. Каждая строка оканчивается комбинацией возврата каретки / перевода строки (CR-LF). Символ пробела сообщает о конце данных. Используйте этот формат для текста ANSI.
CF_WAVE — Представляет звуковые данные в одном из стандартных звуковых форматах, таких как импульсно-кодовой модуляции 11 кГц или 22 кГц (ИКМ) (PCM- pulse code modulation).
CF_TIFF — Формат Файла Тегированного Изображения (TIFF — Tagged-image file format).
CF_UNICODETEXT — Только Windows NT: Формат текста Юникода. Каждая строка оканчивается комбинацией возврата каретки / перевода строки (CR-LF). Символ пробела сообщает о конце данных.

Илон Маск рекомендует:  Что такое код pdf_set_info_creator

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

Функция SetClipboardViewer:

Данная функция добавляет определяемое окно к цепочке окон просмотра буфера обмена.

В качестве входного параметра данной функции служит дескриптор окна (hWndNewViewer), идентифицирующий окно, которое будет добавлено к цепочке окон буфера обмена.
В случае успешного завершения, возвращаемое значение идентифицирует следующее окно в цепочке окон просмотра буфера обмена, однако если происходит ошибка или не имеется никаких других окон в цепочке окон просмотра буфера обмена, возвращаемое значение NULL. Чтобы получить дополнительные данные об ошибке, вызовите функцию GetLastError.
Следует отметить, что если окно является частью цепочки окон просмотра буфера обмена, оно должно обрабатывать сообщения WM_CHANGECBCHAIN и WM_DRAWCLIPBOARD, а также, удаляться из цепочки окон просмотра, вызовом функции ChangeClipboardChain — например, в ответ на сообщение WM_DESTROY.

4. Демонстрационное приложение.

В прикрепленном архиве содержится проект, который демонстрируют работу с буфером обмена.

6. Ключевые слова.

ChangeClipboardChain, CloseClipboard, CountClipboardFormats, EmptyClipboard, EnumClipboardFormats, GetClipboardData, GetClipboardFormatName, GetClipboardOwner, GetClipboardViewer, GetOpenClipboardWindow, GetPriorityClipboardFormat, IsClipboardFormatAvailable, OpenClipboard, RegisterClipboardFormat, SetClipboardData, SetClipboardViewer.

IsClipboardFormatAvailable возвращает true, но GetClipboardData возвращает NULL, даже если текст в буфере обмена — vim

Это проблема, которую я вижу только в vim, но я надеюсь, что кто-то сможет дать совет о том, что искать (с выключением кода Google, я не могу отправлять отчеты об ошибках для vim).

В x64 Windows 8.1 (отлично работает на x64 Windows 7) vim/gvim отлично работает с буфером Windows, пока вы не запустите веб-браузер (хром, firefox, opera, т.е.). Когда браузер работает, vim может размещать текст в буфере обмена, но не может получить текст из буфера обмена. Когда веб-браузер закрыт, буфер обмена снова начнет работать.

Я отследил проблему до IsClipboardFormatAvailable (CF_UNICODETEXT), возвращающего не-NULL, но GetClipboardData (CF_UNICODETEXT), возвращающий NULL в этих условиях. Кажется, что-то специфическое для того, как vim использует win32 api (вероятно, разные вызовы, чем эти), потому что простые тестовые приложения, которые я пишу, делают это отлично.

Я пробовал работать с разными настройками совместимости и работал как администратор, но ничего не изменилось. Такое поведение одинаково для 32-разрядных и 64-битных построений, созданных с помощью Visual Studio 2013 Community и 2010 Professional.

Самое страшное в том, что официальная 32-битная сборка (очень старая на данный момент) отлично работает, но мое собственное построение одного и того же тега (или любой другой сборки, которую я нашел в Интернете) не работает.

IsClipboardFormatAvailable returns true but GetClipboardData returns NULL even when text on clipboard

This is a problem I only see in vim but I am hoping someone can provide advice on what to look for (with google code shutdown, I cannot submit bug reports for vim).

On x64 Windows 8.1 (it works fine on x64 Windows 7) vim/gvim works fine with the windows clipboard until you launch a web browser (chrome, firefox, opera, ie). When the browser is running, vim can place text on the clipboard but cannot get text from the clipboard. When the web browser is closed, the clipboard starts working again.

I have tracked the problem down to IsClipboardFormatAvailable(CF_UNICODETEXT) returning non-NULL but GetClipboardData(CF_UNICODETEXT) returning NULL under these conditions. It seems to be something specific to how vim is using the win32 api (probably different calls than these) because simple test apps that I write doing this work fine.

I have tried running with different compatibility settings and running as administrator but nothing makes a difference. This behavior is the same for both 32-bit and 64-bit builds created using Visual Studio 2013 Community and 2010 Professional.

What is the most puzzling is that the official 32-bit build (very old at this point) works fine but my own build off of the exact same tag (or every other build I have found on the internet) does not work.

Что такое код isclipboardformatavailable

Determines whether the clipboard contains data in the specified format.

Syntax

Parameters

Type: UINT

A standard or registered clipboard format. For a description of the standard clipboard formats, see Standard Clipboard Formats .

Return value

Type: BOOL

If the clipboard format is available, the return value is nonzero.

If the clipboard format is not available, the return value is zero. To get extended error information, call GetLastError.

Remarks

Typically, an application that recognizes only one clipboard format would call this function when processing the WM_INITMENU or WM_INITMENUPOPUP message. The application would then enable or disable the Paste menu item, depending on the return value. Applications that recognize more than one clipboard format should use the GetPriorityClipboardFormat function for this purpose.

Как работает буфер обмена в Windows

Недавно у меня появилась возможность выполнить отладку буфера обмена в Windows, и я решил, что хорошо бы поделиться информацией, которую удалось узнать. Буфер обмена — это тот компонент Windows, который многие из нас используют десятки (сотни?) раз в день, особо не размышляя об этом. Прежде чем взяться за это дело, я даже никогда не задумывался, как всё устроено. Как выяснилось, там столько интересного, что вы даже не можете себе представить. Сначала опишу, как приложения хранят разные типы данных в буфере обмена и как извлекают их оттуда, а затем — как приложения могут «прицепиться» к буферу и отслеживать изменения в нём. В обоих случае вы увидите отладочные записи, которые показывают, как получить доступ к данным из отладчика.

Начнём с обсуждения форматов буфера обмена. Такие форматы используются для описания, какие типы данные можно поместить в буфер. Там есть некоторое количество предопределённых стандартных форматов, которые может использовать приложение, вроде битового массива, текста ANSI, текста в Юникоде и TIFF. Windows также позволяет приложению установить собственный формат. Например, текстовый процессор может зарегистрировать формат, включающий в себя текст, форматирование и картинки. Конечно, это ведёт к определённой проблеме: что произойдёт, если вы скопируете данные из текстового редактора и вставите их в «Блокнот», который не понимает всего этого форматирования и не отображает картинки?

Выход — разрешить одновременное хранение данных в буфере обмена в нескольких форматах. Когда я раньше думал о буфере обмена, то представлял, что там хранится единственный объект («мой текст» или «моя картинка»), но на самом деле мои данные хранятся в буфере в разных формах. Программа, которая берёт информацию из буфера, получает её в том формате, который она может использовать.

Как же данные появляются в буфере обмена? Очень просто, приложение сначала объявляет о праве собственности на буфер обмена через функцию OpenClipboard. После этого программа может очистить буфер обмена командой EmptyClipboard и, наконец, поместить туда свои данные командой SetClipboardData. SetClipboardData принимает два параметра. Первый — это идентификатор одного из форматов буфера обмена, которые мы упоминали выше. Второй — дескриптор сегмента в памяти, который содержит данные в этом формате. Приложение может неоднократно вызывать команду SetClipboardData для каждого из форматов, какие она хочет поместить в буфер, от лучшего к худшему (поскольку то приложение, куда будут вставляться данные, выберет первый подходящий формат из списка). Чтобы облегчить жизнь разработчику, Windows автоматически обеспечивает конвертацию некоторых типов форматов для буфера обмена. По окончании процесса программа вызывает CloseClipboard.

Илон Маск рекомендует:  Что такое код pdf_setrgbcolor_stroke

Когда пользователь нажимает кнопку «Вставить», целевое приложение вызывает OpenClipboard и одну из следующих функций для определени я доступных форматов данных: IsClipboardFormatAvailable, GetPriorityClipboardFormat или EnumClipboardFormats. Если оно находит подходящий формат, то тогда вызывает GetClipboardData с идентификатором нужного формата в качестве параметра, чтобы получить данные. В конце приложение использует команду CloseClipboard для закрытия буфера.

Теперь взглянем, как с помощью отладчика определить, какие данные записаны в буфер обмена. (Заметьте, что все мои записи сделаны в системе Win7/2008 R2 — так что на других версиях ОС они могут выглядеть несколько иначе). Поскольку буфер является частью Win32k.sys, вам понадобится отладчик ядра. Я люблю использовать в качестве контрольной точки win32k!InternalSetClipboardData+0xe4 . В таком смещении хорошо то, что оно находится за регистром RDI, заполненным данными из SetClipboardData в структуре, известной как tagCLIP.

Вот как выглядит вызов к SetClipboardData от «Блокнота»:

Итак, теперь мы можем просмотреть содержимое RDI как tagCLIP и увидеть, что записано в буфер:

Fmt — это формат для буфера обмена. 0Xd — это число 13, что соответствует тексту в формате Юникода. Однако мы не можем просто запустить du по значению hData , потому что это дескриптор, а не прямой указатель на данные. Так что нужно поискать его в глобальной структуре win32k — gSharedInfo:

aheList в gSharedInfo содержит массив с дескрипторами, и последние два байта hData, умноженные на размер записи дескриптора, показывают адрес записи нашего дескриптора:

Если посмотреть phead со смещением 14, то мы получим наши данные (это смещение может отличаться на разных платформах):

Представим другой сценарий. Я скопировал какой-то текст из Wordpad, и команда SetClipboardData отработала определённое количество раз, чтобы разместить данные в разных форматах. Запись в формате Юникода выглядит так::

hData равен нулю! Почему так? Оказывается, буфер обмена позволяет приложению передавать нуль в качестве параметра SetClipboardData для определённого формата. Это означает, что приложение способно предоставить данные в данном формате, но сделает это позже, в случае необходимости. Если я захочу вставить текст в «Блокнот», для чего в буфере должен быть текст в Юникоде, Windows отправит сообщение WM_RENDERFORMAT в окно WordPad, и тогда WordPad предоставит данные в новом формате. Конечно, если приложение закрывается до того, как предоставило данные во всех форматах, Windows понадобятся все форматы. В этом случае Windows отправит сообщение WM_RENDERALLFORMATS, чтобы другие приложения могли использовать данные из буфера обмена после закрытия материнского приложения.

Теперь посмотрим, как приложение может отслеживать буфер обмена на предмет изменений. Это важно знать, потому что в этом месте Windows позволяет сторонним приложениям подключаться к системе. Если у вас наблюдаются непонятные глюки с копированием и вставкой, причиной может быть некорректное поведение какой-то из таких программ. Начнём с того, что рассмотрим механизмы подключения к буферу обмена. Затем рассмотрим, можно ли с помощью отладчика идентифицировать приложения, которые используют такие хуки.

Есть три способа отслеживать буфер обмена на предмет изменений: просмотр буфера, прослушивание форматов буфера и запрос порядкового номера буфера. Мы сосредоточимся на первых двух способах, потому что они предусматривают получение уведомлений, когда содержимое буфера обновилось. В третьем методе приложение должно само проверять каждый раз, изменился ли буфер, и этот метод нельзя использовать в цикле опросов.

Функциональность Clipboard Viewer появилась ещё в версии Windows 2000, если не раньше. Принцип работы довольно простой: приложение, которое заинтересовано в получении уведомлений об изменении в буфере, вызывает SetClipboardViewer и передаёт дескриптор своего окна. Windows хранит этот дескриптор в структуре win32k, и каждый раз при изменении буфера обмена Windows отправляет сообщение WM_DRAWCLIPBOARD в зарегистрированное окно.

Конечно, зарегистрироваться для просмотра буфера могут несколько окон — как Windows справится с этим? Ну, если приложение вызывает SetClipboardViewer, а другое окно раньше уже зарегистрировалось для просмотра буфера обмена, то Windows возвращает новому окну значение дескриптора предыдущего окна. И теперь новое окно, следящее за буфером, обязано вызвать SendMessage каждый раз, когда получает WM_DRAWCLIPBOARD, и уведомить об изменении буфера следующее окно в цепочке тех, кто следит за буфером. Каждое из окон, следящих за буфером, также должно обрабатывать сообщения WM_CHANGECBCHAIN. Такие сообщения уведомляют все остальные окна об удалении одного звена в цепочке и сообщают, какое звено становится следующим в очереди. Это позволяет сохранить цепочку.

Очевидная проблема подобной архитектуры состоит в следующем: она рассчитывает, что каждое приложение, следящее за буфером, будет вести себя корректно, не завершать неожиданно работу и в целом будет хорошим гражданином в системе. Если какое-то из приложений начнёт вести себя недружественно, то оно не отправит уведомление об изменении буфера обмена следующему приложению в цепочке, в результате чего вся цепочка останется без уведомлений.

Чтобы справиться с такими проблемами, в Windows Vista добавили механизм прослушивания формата буфера обмена — Clipboard Format Listener. Он работает во многом так же, как просмотр буфера обмена, за исключением того, что Windows сама ведёт список приложений, которые прослушивают буфер, а не полагается на добропорядочность приложений, которые должны сохранять цепочку.

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

Мы рассмотрели, как зарегистрировать просмотр/прослушивание буфера обмена. Теперь посмотрим, как с помощью отладчика определить, какие программы участвуют в этих процессах. Сначала нужно идентифицировать процесс в сессии, где мы хотим проверить мониторинг буфера обмена. Это может быть любой процесс win32 в этой сессии — он нужен нам просто для того, чтобы найти указатель на Window Station. В этом случае я бы использовал окно «Блокнота», как и раньше:

Далее посмотрим адрес Win32Process как win32k!tagPROCESSINFO и узнаем значение rpwinsta:

Это наша Window Station. Сливаем содержимое через dt:

Обратите внимание на поля spwndClipViewer, spwndClipboardListener и spwndClipOwnerfields. Здесь spwndClipViewer — это последнее зарегистрированное окно в цепочке тех, кто просматривает буфер обмена. Также spwndClipboardListener — последнее зарегистрированное окно прослушивания буфера в списке Clipboard Format Listener. Окно spwndClipOwner — это то окно, которое разместило данные в буфере обмена.

Ели мы знаем окно, то осталось несколько шагов, чтобы узнать, к какому процессу оно относится. Нас интересуют forspwndClipViewer, spwndClipboardListener и spwndClipOwner. Сначала запускаем dt, чтобы узнать значение tagWND. Для этой демонстрации мы используем spwndClipViewer:

Нас интересует только значение head — так что если смещение 0, делаем dt для того же адреса на _THRDESKHEAD:

Теперь запускаем dt для адреса, указанного в поле pti как tagTHREADINFO:

Теперь нам интересно только значение поля pEThread, которое мы можем передать в !thread:

Как видим, просмотр буфера обмена зарегистрировн от имени процесса viewer02.exe. Поскольку просмотр идёт по цепочке, определить следующий процесс в цепочке будет непросто. Но мы можем сделать это для тех, кто прослушивает буфер. Снова взглянем на нашу Window Station:

Если запустить dt на spwndClipboardListener, то увидим поле spwndClipboardListenerNext с указанием следующего прослушивающего процесса:

При достижении последнего процесса в списке прослушивающих буфер tagWND, значение его поля spwndClipboardListenerNext будет нулевым:

Используя адрес окна, мы можем тем же методом добраться до названия процесса. Как упоминалось ранее, поскольку tagWND — это структура ядра, ОС сама хранит указатели spwndClipboardListener/spwndClipboardListenerNext, так что они не могут привести к таким проблемам с отслеживанием буфера, как цепочки просмотра.

На этом заканчивается наш обзор буфера обмена Windows. Надеюсь, для вас он стал информативным. Хотите узнать больше о мониторинге буфера обмена? Вот хорошая статья MSDN об этом.

IsClipboardFormatAvailable

Important:
This is retired content. This content is outdated and is no longer being maintained. It is provided as a courtesy for individuals who are still using these technologies. This content may contain URLs that were valid when originally published, but now link to sites or pages that no longer exist.

This function determines whether the clipboard contains data in the specified format.

Parameters format [in] Unsigned integer that specifies a standard or registered clipboard format.

Nonzero indicates that the clipboard format is available. Zero indicates that If the clipboard format is not available. To get extended error information, call GetLastError.

Typically, an application that recognizes only one clipboard format would call this function when processing the WM_INITMENUPOPUPmessage. The application would then enable or disable the Paste menu item, depending on the return value. Applications that recognize more than one clipboard format should use the GetPriorityClipboardFormatfunction for this purpose.

Runs On Versions Defined in Include Link to
Windows CE OS 1.0 and later Winuser.h Clipbd.lib

Note This API is part of the complete Windows CE OS package as provided by Microsoft. The functionality of a particular platform is determined by the original equipment manufacturer (OEM) and some devices may not support this API.

IsClipboardFormatAvailable возвращает true, но GetClipboardData возвращает NULL, даже если текст в буфере обмена

Это проблема, которую я вижу только в vim, но я надеюсь, что кто-то сможет дать совет о том, что искать (с выключением кода Google, я не могу отправлять отчеты об ошибках для vim).

В x64 Windows 8.1 (отлично работает на x64 Windows 7) vim/gvim отлично работает с буфером Windows, пока вы не запустите веб-браузер (хром, firefox, opera, т.е.). Когда браузер работает, vim может размещать текст в буфере обмена, но не может получить текст из буфера обмена. Когда веб-браузер закрыт, буфер обмена снова начнет работать.

Я отследил проблему до IsClipboardFormatAvailable (CF_UNICODETEXT), возвращающего не-NULL, но GetClipboardData (CF_UNICODETEXT), возвращающий NULL в этих условиях. Кажется, что-то специфическое для того, как vim использует win32 api (вероятно, разные вызовы, чем эти), потому что простые тестовые приложения, которые я пишу, делают это отлично.

Я пробовал работать с разными настройками совместимости и работал как администратор, но ничего не изменилось. Такое поведение одинаково для 32-разрядных и 64-битных построений, созданных с помощью Visual Studio 2013 Community и 2010 Professional.

Самое страшное в том, что официальная 32-битная сборка (очень старая на данный момент) отлично работает, но мое собственное построение одного и того же тега (или любой другой сборки, которую я нашел в Интернете) не работает.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL