クリップボード,フォーマット

ウィンドウはクリップボードに複数のオブジェクトを配置でき、それぞれが同じ情報を異なるクリップボード形式で表します。 ユーザーは、クリップボード上のオブジェクトに使用されるクリップボード形式を認識する必要はありません。

次のトピックでは、クリップボードの形式について説明します。

標準のクリップボード形式

システムで定義されているクリップボード形式は、 標準のクリップボード形式と呼ばれます。 これらのクリップボード形式については、 「標準のクリップボード形式」を参照してください。

登録済みクリップボード形式

多くのアプリケーションは、情報を失うことなく標準のクリップボード形式に変換できないデータを処理します。 これらのアプリケーションは、独自のクリップボード形式を作成できます。 アプリケーションによって定義されるクリップボード形式は、 登録済みのクリップボード形式と呼ばれます。 たとえば、ワープロ アプリケーションが標準のテキスト形式を使用して書式設定されたテキストをクリップボードにコピーした場合、書式設定情報は失われます。 解決策は、リッチ テキスト形式 (RTF) などの新しいクリップボード形式を登録することです。

新しいクリップボード形式を登録するには、 RegisterClipboardFormat 関数を使用します。 この関数は形式の名前を受け取り、登録済みのクリップボード形式を表す符号なし整数値を返します。 登録済みのクリップボード形式の名前を取得するには、符号なし整数値を GetClipboardFormatName 関数に渡します。

複数のアプリケーションがクリップボード形式をまったく同じ名前で登録する場合、クリップボード形式は 1 回だけ登録されます。 RegisterClipboardFormat 関数の呼び出しはどちらも同じ値を返します。 この方法では、2 つの異なるアプリケーションで、登録済みのクリップボード形式を使用してデータを共有できます。

プライベート クリップボード形式

アプリケーションは、 CF_PRIVATELASTを介して CF_PRIVATEFIRST 範囲の値を定義することで、プライベート クリップボード形式を識別できます。 アプリケーションは、システムに登録する必要のないアプリケーション定義データ形式にプライベート クリップボード形式を使用できます。

プライベート クリップボード形式に関連付けられているデータ ハンドルは、システムによって自動的に解放されません。 ウィンドウでプライベート クリップボード形式を使用している場合は、 WM_DESTROYCLIPBOARD メッセージを使用して、不要になった関連リソースを解放できます。

WM_DESTROYCLIPBOARD メッセージの詳細については、 「クリップボードの所有権」を参照してください。

アプリケーションは、 CF_GDIOBJLASTを介して CF_GDIOBJFIRST 範囲でプライベート形式を定義することで、クリップボードにデータ ハンドルを配置できます。 この範囲内の値を使用する場合、データ ハンドルは Windows グラフィックス デバイス インターフェイス (GDI) オブジェクトへのハンドルではなく、GMEM_MOVEABLE フラグを持つ GlobalAlloc 関数によって割り当てられたハンドルです。 クリップボードが空になると、システムは GlobalFree 関数を使用してオブジェクトを自動的に削除します。

複数のクリップボード形式

ウィンドウはクリップボードに複数のクリップボード オブジェクトを配置でき、それぞれが同じ情報を異なるクリップボード形式で表します。 クリップボードに情報を配置する場合、ウィンドウは可能な限り多くの形式でデータを提供する必要があります。 クリップボードで現在使用されている形式の数を調べるには、 CountClipboardFormats 関数を呼び出します。

最も多くの情報を含むクリップボード形式は、最初にクリップボードに配置し、その後にわかりやすい形式を付ける必要があります。 クリップボードから情報を貼り付けるウィンドウは、通常、認識する最初の形式でクリップボード オブジェクトを取得します。 クリップボード形式はクリップボードに配置された順序で列挙されるため、最初に認識される形式も最もわかりやすい形式です。

たとえば、ユーザーがワープロ ドキュメントからスタイル設定されたテキストをコピーするとします。 ドキュメントを含むウィンドウは、RTF などの登録済み形式でクリップボードにデータを最初に配置する場合があります。 その後、ウィンドウはテキスト (CF_TEXT) などのわかりやすい形式でクリップボードにデータを配置します。

クリップボードの内容を別のウィンドウに貼り付けると、ウィンドウは認識する最もわかりやすい形式でデータを取得します。 ウィンドウが RTF を認識すると、対応するデータがドキュメントに貼り付けられます。 それ以外の場合は、テキスト データがドキュメントに貼り付けられ、書式設定情報が失われます。

合成クリップボード形式

システムは、特定のクリップボード形式間でデータを暗黙的に変換します。ウィンドウがクリップボードにない形式でデータを要求した場合、システムは使用可能な形式を要求された形式に変換します。 システムは、次の表に示すようにデータを変換できます。

クリップボードの形式 変換形式
CF_BITMAP CF_DIB
CF_BITMAP CF_DIBV5
CF_DIB CF_BITMAP
CF_DIB CF_PALETTE
CF_DIB CF_DIBV5
CF_DIBV5 CF_BITMAP
CF_DIBV5 CF_DIB
CF_DIBV5 CF_PALETTE
CF_ENHMETAFILE CF_METAFILEPICT
CF_METAFILEPICT CF_ENHMETAFILE
CF_OEMTEXT CF_TEXT
CF_OEMTEXT CF_UNICODETEXT
CF_TEXT CF_OEMTEXT
CF_TEXT CF_UNICODETEXT
CF_UNICODETEXT CF_OEMTEXT
CF_UNICODETEXT CF_TEXT

 

システムが特定のクリップボード形式に対して自動型変換を提供する場合、変換形式をクリップボードに配置しても利点はありません。

システムが特定のクリップボード形式に対して自動型変換を提供し、 EnumClipboardFormats を呼び出してクリップボードのデータ形式を列挙する場合、システムは最初にクリップボードにある形式を列挙し、その後に変換できる形式を列挙します。

ビットマップをコピーするときは、 CF_DIB または CF_DIBV5 形式をクリップボードに配置することをお勧めします。 これは、デバイス依存ビットマップ (CF_BITMAP) の色がシステム パレットに対して相対的であるためです。これは、ビットマップを貼り付ける前に変更される可能性があるためです。 CF_DIB または CF_DIBV5 形式がクリップボードにあり、ウィンドウが CF_BITMAP 形式を要求した場合、システムはその時点で現在のパレットを使用してデバイスに依存しないビットマップ (DIB) をレンダリングします。

(CF_DIBではなく) CF_BITMAP 形式をクリップボードに配置すると、クリップボードが閉じられるとすぐに CF_DIB または CF_DIBV5 クリップボード形式がレンダリングされます。 これにより、DIB の生成に正しいパレットが使用されます。 ビットマップの色空間情報を含む CF_DIBV5 形式をクリップボードに配置すると、 CF_DIB または CF_DIBV5 が要求されたときに、ビットマップの色空間から sRGB 色空間にビットマップ ビットが変換されます。 クリップボードに色空間情報がないときに CF_DIBV5 が要求された場合、システムは BITMAPV5HEADER 構造体の sRGB 色空間情報を返します。 他のクリップボード形式間の変換は、必要に応じて行われます。

クリップボードに CF_PALETTE 形式のデータが含まれている場合、アプリケーションは SelectPalette 関数と RealizePalette 関数を使用して、その論理パレットに対してクリップボード内の他のデータを実現する必要があります。

メタファイルには、 CF_ENHMETAFILECF_METAFILEPICT の 2 つのクリップボード形式があります。 拡張メタファイルの CF_ENHMETAFILE と Windows メタファイルの CF_METAFILEPICT を指定します。

クラウド クリップボードとクリップボード履歴の形式

Windows の一部のバージョンには、最近のクリップボード データ項目の履歴を保持し、ユーザーのデバイス間で同期できる クラウド クリップボード が含まれています。 アプリケーションがクリップボードに保存するデータをクリップボードの履歴に含めたり、他のデバイスと同期させたりしたくない場合、アプリケーションは、Windows システムに既知の名前を持つ特定 の 登録済みクリップボード形式 でデータを配置することで、この動作を制御できます。

  • ExcludeClipboardContentFromMonitorProcessing : クリップボードの履歴にクリップボードのすべての形式が含まれるか、ユーザーの他のデバイスに同期されないように、クリップボードにデータを配置します。
  • CanIncludeInClipboardHistory : クリップボードの履歴にすべてのクリップボード形式が含まれるのを防ぐために、この形式でクリップボードにシリアル化された DWORD 値を 0 に配置するか、クリップボードの履歴にクリップボード項目を明示的に含めるかどうかを明示的に要求するために値 1 を配置します。 これは、ユーザーの他のデバイスとの同期には影響しません。
  • CanUploadToCloudClipboard : この形式のクリップボードにシリアル化された DWORD 値 0 を配置して、すべてのクリップボード形式がユーザーの他のデバイスに同期されないようにするか、代わりに 1 の値を配置してクリップボード項目を他のデバイスに同期することを明示的に要求します。 これは、ローカル デバイスのクリップボード履歴には影響しません。

他の登録済みクリップボード形式と同様に、 RegisterClipboardFormat 関数を使用して、上記の 3 つの各形式を識別する符号なし整数値を取得する必要があります。