Shell 剪貼簿格式
殼層剪貼簿格式可用來識別透過剪貼簿傳輸的Shell資料類型。 大部分的Shell剪貼簿格式都會識別資料類型,例如檔名清單或專案標識子清單指標(PIDL)。 不過,某些格式用於來源與目標之間的通訊。 它們可藉由支援殼層作業,例如 優化移動 和 delete_on_paste,來加速數據傳輸程式。 殼層數據一律包含在 數據物件中, 會使用 FORMATETC 結構來描述數據。 結構的 cfFormat 成員會設定為特定數據專案的剪貼簿格式。 其他成員會提供其他資訊,例如數據傳輸機制。 數據包含在隨附 STGMEDIUM 結構中。
注意
標準剪貼簿格式識別碼的格式CF_XXX。 常見的範例是CF_TEXT,用於傳輸 ANSI 文字數據。 這些標識碼具有預先定義的值,可以直接搭配 FORMATETC結構使用。 除了 CF_HDROP之外,不會預先定義殼層格式識別符。 除了 DragWindow 之外,它們的格式CFSTR_XXX。 為了區分這些值與預先定義的格式,通常稱為 格式。 不過,不同於預先定義的格式,它們必須先由來源和目標註冊,才能用來傳輸數據。 若要註冊 Shell 格式,請包含 Shlobj.h 頭檔,並將 CFSTR_XXX 格式識別碼傳遞至 RegisterClipboardFormat。 此函式會傳回有效的剪貼簿格式值,然後可用來做為 FORMATETC 結構的 cfFormat 成員。
Shell 剪貼簿格式會根據它們的使用方式,在這裡組織成三個群組。
傳輸檔案系統物件的格式
這些格式可用來傳輸一或多個檔案或其他Shell物件。
- CF_HDROP
- CFSTR_FILECONTENTS
- CFSTR_FILEDESCRIPTOR
- CFSTR_FILENAME
- CFSTR_FILENAMEMAP
- CFSTR_MOUNTEDVOLUME
- CFSTR_SHELLIDLIST
- CFSTR_SHELLIDLISTOFFSET
CF_HDROP
傳輸現有檔案群組的位置時,會使用此剪貼簿格式。 不同於其他 Shell 格式,其已預先定義,因此不需要呼叫 RegisterClipboardFormat。 數據是由包含全域記憶體物件的 STGMEDIUM 結構所組成。 結構的 hGlobal 成員會指向 DROPFILES 結構,作為其 hGlobal 成員。
pFilesDROPFILES 結構的成員包含包含檔名之雙 null終止字元數位移。 如果您要從數據物件擷取CF_HDROP格式,您可以使用 DragQueryFile,從全域記憶體物件擷取個別檔名。 如果您要建立要放在數據物件中的CF_HDROP格式,則必須建構檔名陣列。
檔名陣列包含一系列字串,每個字串都包含一個檔案的完整路徑,包括終止 NULL 字元。 額外的 null 字元附加至最後一個字元串,以終止數位。 例如,如果檔案 c:\temp1.txt 和 c:\temp2.txt 正在傳輸,字元陣列看起來會像這樣:
c:\temp1.txt'\0'c:\temp2.txt'\0''\0'
注意
在此範例中,『\0』 用來表示 null 字元,而不是應該包含的常值字元。
如果對像是拖放作業的一部分複製到剪貼簿,則 ptDROPFILES 結構的成員包含卸除對象的點座標。 您可以使用 DragQueryPoint 來擷取游標座標。
如果此格式存在於數據物件中,則 OLE 拖曳迴圈會模擬具有非 OLE 置放目標 WM_DROPFILES 功能。 如果您的應用程式是 Windows 3.1 系統上拖放作業的來源,這很重要。
CFSTR_FILECONTENTS
此格式標識碼會搭配 CFSTR_FILEDESCRIPTOR 格式來傳輸數據,就如同檔案一樣,不論其實際儲存方式為何。 數據是由代表一個檔案內容的 STGMEDIUM 結構所組成。 檔案通常以數據流物件表示,以避免必須將檔案的內容放在記憶體中。 在此情況下,STGMEDIUM 結構的 tymed 成員會設定為 TYMED_ISTREAM,而檔案會以 IStream 介面表示。 檔案也可以是記憶體或全域記憶體物件(TYMED_ISTORAGE或TYMED_HGLOBAL)。 相關聯的CFSTR_FILEDESCRIPTOR格式包含每個指定檔案名稱和屬性的 FILEDESCRIPTOR 結構。
目標會將與CFSTR_FILECONTENTS格式相關聯的數據視為檔案。 當目標呼叫 IDataObject::GetData 以擷取數據時,它會藉由將 FORMATETC 結構的 lindex 成員設定為檔案 FILEDESCRIPTORCFSTR_FILEDESCRIPTOR 結構之以零起始的索引,來指定特定檔案。 然後,目標會使用傳回的介面指標或全域記憶體句柄來擷取數據。
CFSTR_FILEDESCRIPTOR
此格式識別碼會搭配 CFSTR_FILECONTENTS 格式使用,以檔案群組的形式傳輸數據。 這兩種格式是傳輸未儲存為檔案系統檔案之Shell物件的慣用方式。 例如,這些格式可以用來將電子郵件訊息群組傳送為個別檔案,即使每個電子郵件實際上儲存為資料庫中的數據區塊也一樣。 數據是由包含全域記憶體物件的 STGMEDIUM 結構所組成。 結構的 hGlobal 成員指向 FILEGROUPDESCRIPTOR 結構,後面接著一個數位,其中包含群組中每個檔案的一個 FILEDESCRIPTOR 結構。 針對每個 FILEDESCRIPTOR 結構,會有個別CFSTR_FILECONTENTS格式,其中包含檔案的內容。 若要識別特定檔案的CFSTR_FILECONTENTS格式,請將 FORMATETC 結構的 lIndex 值設定為檔案 FILEDESCRIPTOR 結構的以零起始的索引。
CFSTR_FILEDESCRIPTOR格式通常用來傳輸數據,就像是一組檔案一樣,不論其實際儲存方式為何。 從目標的觀點來看,每個CFSTR_FILECONTENTS格式都代表單一檔案,並據以處理。 不過,來源可以以任何方式儲存數據。 雖然CSFTR_FILECONTENTS格式可能對應至單一檔案,但也可以代表來源從資料庫或文字檔擷取的數據。
CFSTR_FILENAME
此格式識別碼是用來傳輸單一檔案。 數據是由包含全域記憶體物件的 STGMEDIUM 結構所組成。 結構的 hGlobal 成員指向包含檔案完整檔案路徑的單一 null終止字串。 此格式已由 CF_HDROP取代,但支援與 Windows 3.1 應用程式的回溯相容性。
CFSTR_FILENAMEMAP
當 CF_HDROP 格式的檔案群組重新命名及傳輸時,會使用此格式識別符。 數據是由包含全域記憶體物件的 STGMEDIUM 結構所組成。 結構的 hGlobal 成員指向雙 null終止字元陣列。 此陣列包含每個檔案的新名稱,其順序與隨附CF_HDROP格式的檔案順序相同。 字元陣列格式與CF_HDROP用來列出傳輸的檔案相同。
CFSTR_MOUNTEDVOLUME
此格式識別碼用來傳輸掛接磁碟區上的路徑。 它類似於 CF_HDROP,但它只包含單一路徑,而且可以處理在資料夾上掛接磁碟區時可能需要代表路徑的較長路徑字串。 數據是由包含全域記憶體物件的 STGMEDIUM 結構所組成。 結構的 hGlobal 成員指向包含完整檔案路徑的單一 null終止字串。 路徑字串必須以 『\』 字元結尾,後面接著結束 NULL。
在 Windows 2000 之前,磁碟區只能掛接在驅動器號上。 針對具有NTFS格式化磁碟驅動器的 Windows 2000 和更新版本系統,您也可以在空的資料夾上掛接磁碟區。 此功能可讓磁碟區掛接,而不需要佔用驅動器號。 掛接的磁碟區可以使用任何目前支援的格式,包括 FAT、FAT32、NTFS 和 CDFS。
您可以實作 屬性表處理程式,將頁面新增至磁碟驅動器屬性表。 如果磁碟區掛接在驅動器號上,Shell 會以 CF_HDROP 格式將路徑資訊傳遞給處理程式。 使用 Windows 2000 和更新版本系統時,當磁碟區掛接在驅動器號上時,會使用CF_HDROP格式,就像舊版系統一樣。 不過,如果磁碟區掛接在資料夾上,則會使用 CFSTR_MOUNTEDVOLUME 格式識別碼,而不是CF_HDROP。
如果只使用驅動器號來掛接磁碟區,則只會使用 CF_HDROP,而且現有的屬性表處理程式會如同先前的系統一樣運作。 不過,如果您想要讓處理程式顯示資料夾和驅動器號上掛接的磁碟區頁面,處理程式必須能夠同時瞭解CSFTR_MOUNTEDVOLUME和CF_HDROP格式。
CFSTR_SHELLIDLIST
傳輸一或多個現有命名空間物件的位置時,會使用此格式識別符。 其使用方式與 CF_HDROP大致相同,但它包含 PIDL,而不是文件系統路徑。 使用 PIDL 可讓CFSTR_SHELLIDLIST格式處理虛擬物件和檔案系統物件。 數據是包含全域記憶體物件的 STGMEDIUM 結構。 結構的 hGlobal 成員指向 CIDA結構。
aoffsetCIDA 結構的成員是陣列,其中包含要傳輸之每個 PIDL 之 ITEMIDLIST 結構的開頭位移。 若要擷取特定的 PIDL,請先判斷其索引。 然後,將對應至該索引的 aoffset 值新增至 CIDA 結構 位址。
aoffset 的第一個專案包含父資料夾完整 PIDL 的位移。 如果這個 PIDL 是空的,父資料夾就是桌面。 數位的其餘每個元素都包含要傳送之其中一個 PIDL 的位移。 所有這些 PIDL 都與父資料夾的 PIDL 相對。
下列兩個巨集可用來從 CIDA結構擷取 PIDL。 第一個會取得 結構的指標,並擷取父資料夾的 PIDL。 第二個會擷取 結構的指標,並擷取由其以零起始的索引所識別的其中一個其他 PIDL。
#define GetPIDLFolder(pida) (LPCITEMIDLIST)(((LPBYTE)pida)+(pida)->aoffset[0])
#define GetPIDLItem(pida, i) (LPCITEMIDLIST)(((LPBYTE)pida)+(pida)->aoffset[i+1])
注意
這些巨集傳回的值是 PIDL ITEMIDLIST 結構的指標。 由於這些結構長度不同,因此您必須逐步執行每個 ITEMIDLIST 結構的 SHITEMID 結構,以判斷結構的結尾,直到到達標示結尾的雙位元組 NULL 為止。
CFSTR_SHELLIDLISTOFFSET
此格式識別碼會與 CF_HDROP、CFSTR_SHELLIDLIST和 CFSTR_FILECONTENTS 等格式搭配使用,以指定傳輸之後物件群組的位置。 數據是由包含全域記憶體物件的 STGMEDIUM 結構所組成。 結構的 hGlobal 成員會指向 POINT 結構的陣列。 第一個結構會指定矩形左上角的螢幕座標,以像素為單位來括住群組。 結構的其餘部分會指定個別物件相對於群組位置的位置。 它們的順序必須與用來以相關聯格式列出對象的順序相同。
傳輸虛擬物件的格式
CFSTR_SHELLIDLIST格式可用來傳輸檔案系統和虛擬物件。 不過,也有數種特殊格式可用來傳輸特定類型的虛擬物件。
CFSTR_NETRESOURCES
傳輸網路資源,例如網域或伺服器時,會使用此格式識別符。 數據是包含全域記憶體物件的 STGMEDIUM 結構。 結構的 hGlobal 成員指向 NRESARRAY 結構。 該結構的 nr 成員表示 NETRESOURCE 結構,其 lpRemoteName 成員包含識別網路資源的 null字串。 卸除目標接著可以使用數據搭配任何 Windows 網路功能 (WNet) API 函式,例如 WNetAddConnection,以在 對象上執行網路作業。
CFSTR_PRINTERGROUP
傳輸印表機的易記名稱時,會使用此格式識別碼。 數據是包含全域記憶體物件的 STGMEDIUM 結構。 結構的 hGlobal 成員會以與 CF_HDROP一起使用的格式指向字串。 不過,pFilesDROPFILES 結構的成員包含一或多個易記的印表機名稱,而不是檔案路徑。
CFSTR_INETURL
此格式識別碼會取代 CFSTR_SHELLURL。 如果您想要讓應用程式作剪貼簿 URL,請使用 CFSTR_INETURL,而不是CFSTR_SHELLURL (已淘汰)。 此格式提供單一 URL 的最佳剪貼簿表示法。 如果未定義 UNICODE,應用程式會擷取 URL 的CF_TEXT/CFSTR_SHELLURL版本。 如果已定義 UNICODE,應用程式會擷取 URL 的CF_UNICODE版本。
CFSTR_SHELLURL (已淘汰)
注意
此格式識別碼已被取代;請改用 CFSTR_INETURL。
來源與目標之間的通訊格式
這些格式識別碼允許來源與目標之間的通訊。 這些格式隨附數據,並讓應用程式對涉及Shell對象的移動-複製貼上或拖放作業擁有更大的控制權。
- CFSTR_INDRAGLOOP
- CFSTR_LOGICALPERFORMEDDROPEFFECT
- CFSTR_PASTESUCCEEDED
- CFSTR_PERFORMEDDROPEFFECT
- CFSTR_PREFERREDDROPEFFECT
- CFSTR_TARGETCLSID
- CFSTR_UNTRUSTEDDRAGDROP
- DragWindow
CFSTR_INDRAGLOOP
數據物件會使用此格式識別碼來指出它是否位於拖放迴圈中。 數據是包含全域記憶體物件的 STGMEDIUM 結構。 結構的 hGlobal 成員會指向 DWORD 值。 如果 DWORD 值為非零值,則數據對象位於拖放迴圈內。 如果值設定為零,則數據物件不在拖放循環內。
某些置放目標可能會呼叫 IDataObject::GetData,並在物件仍在拖放迴圈內時嘗試擷取數據。 針對每個這類專案完整轉譯物件,可能會導致拖曳游標停止。 如果數據物件支援 CFSTR_INDRAGLOOP,目標可以改用該格式來檢查拖放循環的狀態,並避免物件記憶體密集轉譯,直到實際卸除為止。 需要大量轉譯的記憶體格式仍應包含在 FORMATETC 列舉值中,以及呼叫 IDataObject::QueryGetData。 如果數據物件未設定CFSTR_INDRAGLOOP,它應該會像將值設定為零一樣。
CFSTR_LOGICALPERFORMEDDROPEFFECT
5.0 版。此格式識別碼可讓卸除來源呼叫數據物件的 IDataObject::GetData 方法來判斷 Shell 數據傳輸的結果。 數據是包含全域記憶體物件的 STGMEDIUM 結構。 結構的 hGlobal 成員指向包含 DROPEFFECT 值的 DWORD。
CFSTR_PERFORMEDDROPEFFECT 格式識別碼的目的是允許目標向數據物件指出實際執行的作業。 不過,殼層會盡可能針對文件系統物件使用 優化移動。 在此情況下,Shell 通常會將CFSTR_PERFORMEDDROPEFFECT值設定為 DROPEFFECT_NONE,以向數據物件指出原始數據已刪除。 因此,來源無法使用CFSTR_PERFORMEDDROPEFFECT值來判斷已執行的作業。 雖然大多數來源不需要此資訊,但有一些例外狀況。 例如,即使優化移動不需要來源刪除任何數據,來源可能仍然需要更新相關的資料庫,以指出檔案已移動或複製。
如果來源必須知道發生哪個作業,它可以呼叫數據物件的 IDataObject::GetData 方法,並要求CFSTR_LOGICALPERFORMEDDROPEFFECT格式。 此格式基本上會反映作業完成之後,用戶觀點所發生的情況。 如果已建立新檔案並刪除源檔,則使用者會看到移動作業,且格式的數據值設定為DROPEFFECT_MOVE。 如果源檔仍然存在,使用者會看到複製作業,且格式的數據值設定為DROPEFFECT_COPY。 如果已建立連結,格式的數據值將會DROPEFFECT_LINK。
CFSTR_PASTESUCCEEDED
目標會使用此格式標識符,透過其 IDataObject::SetData 方法通知資料物件,刪除貼上作業成功。 數據是包含全域記憶體物件的 STGMEDIUM 結構。 結構的 hGlobal 成員指向包含 DROPEFFECT 值的 DWORD。 此格式是用來通知資料對象應該完成剪下作業,並視需要刪除原始數據。 如需詳細資訊,請參閱 Delete-on-Paste Operations。
CFSTR_PERFORMEDDROPEFFECT
目標會使用此格式識別符,透過其 IDataObject::SetData 方法通知資料對象資料傳輸的結果。 數據是包含全域記憶體物件的 STGMEDIUM 結構。 結構的 hGlobal 成員指向設定為適當 DROPEFFECT 值 DWORD,通常是DROPEFFECT_MOVE或DROPEFFECT_COPY。
當作業的結果可以是移動或複製時,通常會使用此格式,例如在 優化移動 或刪除貼上作業中。 它提供可靠的方法,讓目標告訴數據對象實際發生的情況。 因為 DoDragDrop 傳回的 pdwEffect 值無法可靠地指出已執行的作業,所以引進了此值。 CFSTR_PERFORMEDDROPEFFECT 格式是指出已進行未優化移動的可靠方式。
CFSTR_PREFERREDDROPEFFECT
來源會使用此格式識別碼來指定其慣用的數據傳輸方法是移動或複製。 卸除目標會呼叫數據物件的 IDataObject::GetData 方法來要求此格式。 數據是包含全域記憶體物件的 STGMEDIUM 結構。 結構的 hGlobal 成員會指向 DWORD 值。 如果慣用移動作業,或慣用複製作業 DROPEFFECT_COPY,則此值會設定為 DROPEFFECT_MOVE。
當來源可以支援移動或複製作業時,就會使用此功能。 它會使用 CFSTR_PREFERREDDROPEFFECT 格式,將其喜好設定傳達給目標。 因為目標不一定要接受要求,因此目標必須呼叫來源的 IDataObject::SetData 方法,並具有 CFSTR_PERFORMEDDROPEFFECT 格式,以告訴數據對象實際執行的作業。
使用 貼上刪除 作業,CFSTR_PREFERREDDROPFORMAT格式會用來告訴目標來源是否執行剪下或複製。 透過拖放作業,您可以使用CFSTR_PREFERREDDROPFORMAT來指定殼層的動作。 如果這個格式不存在,Shell 會根據內容執行默認動作。 例如,如果使用者從某個磁碟區拖曳檔案,並將它放在另一個磁碟區上,Shell 的默認動作就是複製檔案。 藉由在數據物件中包含CFSTR_PREFERREDDROPFORMAT格式,您可以覆寫預設動作,並明確指示殼層複製、移動或鏈接檔案。 如果使用者選擇使用右鍵拖曳,CFSTR_PREFERREDDROPFORMAT指定 拖放 快捷方式功能表上的預設命令。 使用者仍然可以自由選擇功能表上的其他命令。
在Microsoft Internet Explorer 4.0 之前,應用程式會在 dwFlag s 中設定FD_LINKUI,以 FILEDESCRIPTOR 結構的成員來指示它傳輸快捷方式文件類型。 然後,目標必須使用可能耗時的呼叫來 IDataObject::GetData,以找出是否已設定FD_LINKUI旗標。 現在,指示傳送快捷方式的慣用方法是使用設定為 DROPEFFECT_LINK的CFSTR_PREFERREDDROPEFFECT格式。 不過,為了與較舊的系統回溯相容性,來源仍應設定FD_LINKUI旗標。
CFSTR_TARGETCLSID
這個格式識別碼是由目標用來提供其CLSID給來源。 數據是包含全域記憶體物件的 STGMEDIUM 結構。 結構的 hGlobal 成員指向置放目標的 CLSID GUID。
此格式主要用於允許將物件拖曳至回收站來刪除物件。 在回收站中卸除物件時,會呼叫來源的 IDataObject::SetData 方法,並將CFSTR_TARGETCLSID格式設定為回收站的 CLSID (CLSID_RecycleBin)。 然後來源可以刪除原始物件。
CFSTR_UNTRUSTEDDRAGDROP
Windows Internet Explorer 和 Windows Shell 會使用此格式識別符來提供機制,以封鎖或提示從 Internet Explorer 與 URLACTION_SHELL_ENHANCED_DRAGDROP_SECURITY 旗標一起執行的拖放作業。
拖放作業的來源會新增 CFSTR_UNTRUSTEDDRAGDROP,以指定資料物件可能包含不受信任的數據。 數據是由包含全域記憶體物件的 STGMEDIUM 結構來表示。 結構的 hGlobal 成員會指向 DWORD 設定為適當的 URL 動作 旗標,以使用 PUAF_ENFORCERESTRICTED 旗標透過 IInternetSecurityManager::P rocessUrlAction 方法進行原則檢查。
DragWindow
此格式用於拖放作業,以識別物件的拖曳影像(視窗),以便動態更新其視覺資訊。 當物件拖曳到置放目標上時,應用程式會更新其 DROPDESCRIPTION 結構,以回應 IDropTarget::D ragOver 或 IDropSource::GiveFeedback 方法。 DROPDESCRIPTION 會更新為新的 DROPIMAGETYPE 值,指出要套用至拖曳視窗視覺效果的裝飾;例如,表示檔案正在複製,而不是移動,或對象無法卸除至該位置。 不過,在物件收到 DDWM_UPDATEWINDOW 訊息之前,不會更新視覺效果。 此格式會將收件者拖曳視窗的 HWND 提供給 DDWM_UPDATEWINDOW 郵件的寄件者。
剪貼簿資料的類型為 TYMED_HGLOBAL。 它是 DWORDHWND表示法。 數據可以傳遞至 basetsd.h 中定義的 ULongToHandle 函式,以提供 64 位 HWND,以用於 64 位 Windows。
此格式不需要包含 Shlobj.h。