剪貼簿格式
視窗可以在剪貼簿上放置多個物件,每個物件都以不同的剪貼簿格式來表示相同的資訊。 使用者不需要知道剪貼簿上物件所使用的剪貼簿格式。
下列主題描述剪貼簿格式。
標準剪貼簿格式
系統定義的剪貼簿格式稱為 標準剪貼簿格式。 這些剪貼簿格式會以 標準剪貼簿格式描述。
已註冊的剪貼簿格式
許多應用程式都使用無法轉譯為標準剪貼簿格式的數據,而不會遺失資訊。 這些應用程式可以建立自己的剪貼簿格式。 應用程式所定義的剪貼簿格式稱為 已註冊的剪貼簿格式。 例如,如果文字處理應用程式使用標準文字格式將格式化文字複製到剪貼簿,格式資訊將會遺失。 解決方案是註冊新的剪貼簿格式,例如 RTF 格式。
若要註冊新的剪貼簿格式,請使用 RegisterClipboardFormat 函式。 此函式會採用格式的名稱,並傳回表示已註冊剪貼簿格式的不帶正負號整數值。 若要擷取已註冊剪貼簿格式的名稱,請將不帶正負號的整數值傳遞至 GetClipboardFormatName 函式。
如果多個應用程式使用完全相同的名稱註冊剪貼簿格式,則剪貼簿格式只會註冊一次。 這兩個呼叫 RegisterClipboardFormat 函式都會傳回相同的值。 如此一來,兩個不同的應用程式就可以使用已註冊的剪貼簿格式來共享數據。
私人剪貼簿格式
應用程式可以定義範圍中的 值, CF_PRIVATEFIRST到 CF_PRIVATELAST,以識別私人剪貼簿格式。 應用程式可以針對不需要向系統註冊的應用程式定義數據格式使用私人剪貼簿格式。
系統不會自動釋放與私人剪貼簿格式相關聯的數據句柄。 如果您的視窗使用私人剪貼簿格式,您可以使用 WM_DESTROYCLIPBOARD 訊息釋放不再需要的任何相關資源。
如需WM_DESTROYCLIPBOARD訊息的詳細資訊,請參閱剪貼簿擁有權。
應用程式可以將數據句柄放在剪貼簿上,方法是在CF_GDIOBJFIRST到CF_GDIOBJLAST的範圍中定義私用格式。 使用此範圍中的值時,數據句柄不是 Windows Graphics Device Interface (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_BITMAP 格式(而非 CF_DIB),系統會在剪貼簿關閉后立即轉 譯CF_DIB 或 CF_DIBV5 剪貼簿格式。 這可確保使用正確的調色盤來產生 DIB。 如果您在剪貼簿中使用位圖色彩空間資訊放置CF_DIBV5格式,系統會在要求CF_DIB或CF_DIBV5時,將位圖色彩空間中的位圖位轉換成 sRGB 色彩空間。 如果在剪貼簿中沒有色彩空間資訊時要求CF_DIBV5,系統會傳回 BITMAPV5HEADER 結構中的 sRGB 色彩空間資訊。 其他剪貼簿格式之間的轉換會視需要發生。
如果剪貼簿包含CF_PALETTE格式的數據,應用程式應該使用 SelectPalette 和 RealizePalette 函式,針對該邏輯調色盤在剪貼簿中實現任何其他數據。
元檔有兩種剪貼簿格式: CF_ENHMETAFILE 和 CF_METAFILEPICT。 針對增強型元檔指定CF_ENHMETAFILE,並針對 Windows 元檔指定CF_METAFILEPICT。
雲端剪貼簿和剪貼簿記錄格式
某些版本的 Windows 包含 Cloud Clipboard,它會保留最近剪貼簿數據項的歷程記錄,並可同步處理使用者裝置之間的記錄。 如果您不想讓應用程式放置於剪貼簿上的數據包含在剪貼簿歷程記錄中,或與其他裝置同步處理,您的應用程式可以將數據放在 Windows 系統已知的特定 已註冊剪貼簿格式 中來控制此行為:
- ExcludeClipboardContentFromMonitorProcessing :將此格式的任何數據放在剪貼簿上,以防止剪貼簿記錄中包含所有剪貼簿格式,或同步處理至使用者的其他裝置。
- CanIncludeInClipboardHistory :將此格式的串行化 DWORD 值放在剪貼簿上,以防止剪貼簿記錄中包含所有剪貼簿格式,或改為放置一個值,以明確要求剪貼簿專案包含在剪貼簿記錄中。 這不會影響使用者其他裝置的同步處理。
- CanUploadToCloudClipboard :以這個格式將串行化的 DWORD 值放在剪貼簿上,以防止所有剪貼簿格式同步處理至使用者的其他裝置,或改為放置一個值,以明確要求剪貼簿專案同步處理至其他裝置。 這不會影響本機裝置的剪貼簿記錄。
如同其他已註冊的剪貼簿格式,您必須使用 RegisterClipboardFormat 函式來取得不帶正負號的整數值,以識別上述 3 種格式的每個格式。