Shell 剪貼簿格式
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
傳輸現有檔案群組的位置時,會使用此剪貼簿格式。 不同于其他 Shell 格式,它會預先定義,因此不需要呼叫 RegisterClipboardFormat。 資料是由包含全域記憶體物件的 STGMEDIUM 結構所組成。 結構的 hGlobal 成員會指向 DROPFILES 結構作為 其 hGlobal 成員。
DROPFILES結構的pFiles成員包含包含檔案名之雙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 字元,而不是應該包含的常值字元。
如果物件已複製到剪貼簿做為拖放作業的一部分,DROPFILES結構的pt成員會包含卸載物件之點的座標。 您可以使用 DragQueryPoint 來擷取游標座標。
如果此格式存在於資料物件中,OLE 拖曳迴圈會模擬非 OLE 置放目標的 WM_DROPFILES 功能。 如果您的應用程式是 Windows 3.1 系統上拖放作業的來源,這很重要。
不論其實際儲存方式為何,此格式識別碼會與 CFSTR_FILEDESCRIPTOR 格式搭配使用,以如同檔案一樣傳輸資料。 資料是由 STGMEDIUM 結構所組成,代表一個檔案的內容。 檔案通常會表示為數據流物件,以避免將檔案的內容放在記憶體中。 在此情況下,STGMEDIUM結構的tymed成員會設定為 TYMED_ISTREAM,而檔案會以IStream介面表示。 檔案也可以是儲存體或全域記憶體物件 (TYMED_ISTORAGE或TYMED_HGLOBAL) 。 相關聯的CFSTR_FILEDESCRIPTOR格式包含每個指定檔案名稱和屬性的 FILEDESCRIPTOR 結構。
目標會將與CFSTR_FILECONTENTS格式相關聯的資料視為檔案。 當目標呼叫IDataObject::GetData以擷取資料時,它會藉由將FORMATETC結構的lindex成員設定為檔案FILEDESCRIPTOR結構的零起始索引,以隨附的 CFSTR_FILEDESCRIPTOR格式來指定特定檔案。 然後,目標會使用傳回的介面指標或全域記憶體控制碼來擷取資料。
此格式識別碼會與 CFSTR_FILECONTENTS 格式搭配使用,以一組檔案形式傳輸資料。 這兩種格式是傳送未儲存為檔案系統檔案之 Shell 物件的慣用方式。 例如,這些格式可用來將電子郵件訊息群組當作個別檔案傳送,即使每個電子郵件實際上儲存為資料庫中的資料區塊也一樣。 資料是由包含全域記憶體物件的 STGMEDIUM 結構所組成。 結構的 hGlobal 成員指向 FILEGROUPDESCRIPTOR 結構,後面接著包含群組中每個檔案一個 FILEDESCRIPTOR 結構的陣列。 針對每個 FILEDESCRIPTOR 結構,會有個別的CFSTR_FILECONTENTS格式,其中包含檔案的內容。 若要識別特定檔案的CFSTR_FILECONTENTS格式,請將FORMATETC結構的lIndex值設定為檔案FILEDESCRIPTOR結構的以零起始的索引。
CFSTR_FILEDESCRIPTOR格式通常用來傳輸資料,就像是一組檔案一樣,不論其實際儲存方式為何。 從目標的觀點來看,每個CFSTR_FILECONTENTS格式都代表單一檔案,並據以處理。 不過,來源可以以任何方式儲存資料。 雖然CSFTR_FILECONTENTS格式可能會對應至單一檔案,但也可能代表來源從資料庫或文字檔擷取的資料。
這個格式識別碼是用來傳輸單一檔案。 資料是由包含全域記憶體物件的 STGMEDIUM 結構所組成。 結構的 hGlobal 成員指向包含檔案完整檔案路徑的單一 Null終止字串。 CF_HDROP已取代此 格式,但支援與 Windows 3.1 應用程式的回溯相容性。
當 CF_HDROP 格式的檔案群組重新命名及傳輸時,就會使用這個格式識別碼。 資料是由包含全域記憶體物件的 STGMEDIUM 結構所組成。 結構的 hGlobal 成員會指向雙 Null終止的字元陣列。 此陣列包含每個檔案的新名稱,其順序與檔案以隨附CF_HDROP格式列出的順序相同。 字元陣列的格式與CF_HDROP用來列出傳輸的檔案所使用的格式相同。
這個格式識別碼是用來傳輸掛接磁片區上的路徑。 它類似于 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格式。
傳輸一或多個現有命名空間物件的位置時,會使用此格式識別碼。 其使用方式與 CF_HDROP大致相同,但包含 PIDL,而不是檔案系統路徑。 使用 PIDL 可讓CFSTR_SHELLIDLIST格式處理虛擬物件和檔案系統物件。 資料是包含全域記憶體物件的 STGMEDIUM 結構。 結構的 hGlobal 成員會指向 CIDA 結構。
CIDA結構的aoffset成員是陣列,其中包含要傳輸之每個 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 為止。
此格式識別碼會與 CF_HDROP、 CFSTR_SHELLIDLIST和 CFSTR_FILECONTENTS 等格式搭配使用,以指定在傳輸之後的物件群組位置。 資料是由包含全域記憶體物件的 STGMEDIUM 結構所組成。 結構的 hGlobal 成員會指向 POINT 結構的陣列。 第一個 結構會指定矩形左上角的螢幕座標,以圖元為單位來括住群組。 結構的其餘部分會指定相對於群組位置之個別物件的位置。 它們的順序必須與用來以相關聯格式列出物件的順序相同。
CFSTR_SHELLIDLIST格式可用來傳輸檔案系統和虛擬物件。 不過,也有數種特殊格式可用來傳輸特定類型的虛擬物件。
傳輸網路資源時,會使用此格式識別碼,例如網域或伺服器。 資料是包含全域記憶體物件的 STGMEDIUM 結構。 結構的 hGlobal 成員會指向 NRESARRAY 結構。 該結構的 nr 成員表示 NETRESOURCE 結構,其 lpRemoteName 成員包含識別網路資源的 Null終止字串。 然後卸載目標可以將資料與任何 Windows 網路 (WNet) API 函式搭配使用,例如 WNetAddConnection,以對物件執行網路作業。
傳輸印表機的易記名稱時,會使用此格式識別碼。 資料是包含全域記憶體物件的 STGMEDIUM 結構。 結構的 hGlobal 成員會以與搭配 CF_HDROP一起使用的格式指向字串。 不過,DROPFILES結構的pFiles成員包含印表機的一或多個易記名稱,而不是檔案路徑。
此格式識別碼會取代 CFSTR_SHELLURL (取代) 。 如果您想要讓應用程式操作剪貼簿 URL,請使用 CFSTR_INETURL,而不是CFSTR_SHELLURL (已被取代) 。 此格式提供單一 URL 的最佳剪貼簿標記法。 如果未定義 UNICODE,應用程式會擷取 URL 的CF_TEXT/CFSTR_SHELLURL版本。 如果已定義 UNICODE,應用程式會擷取 URL 的CF_UNICODE版本。
注意
此格式識別碼已被取代;請改用 CFSTR_INETURL。
這些格式識別碼允許來源與目標之間的通訊。 資料隨附的格式,並可讓應用程式更充分控制涉及 Shell 物件的移動複製貼上或拖放作業。
- CFSTR_INDRAGLOOP
- CFSTR_LOGICALPERFORMEDDROPEFFECT
- CFSTR_PASTESUCCEEDED
- CFSTR_PERFORMEDDROPEFFECT
- CFSTR_PREFERREDDROPEFFECT
- CFSTR_TARGETCLSID
- CFSTR_UNTRUSTEDDRAGDROP
- DragWindow
資料物件會使用此格式識別碼來指出它是否在拖放迴圈中。 資料是包含全域記憶體物件的 STGMEDIUM 結構。 結構的 hGlobal 成員會指向 DWORD 值。 如果 DWORD 值不是零值,則資料物件會位於拖放迴圈內。 如果值設定為零,則資料物件不在拖放迴圈內。
有些置放目標可能會呼叫 IDataObject::GetData ,並在物件仍在拖放迴圈內嘗試擷取資料。 針對每個這類發生專案完整轉譯物件,可能會導致拖曳游標停止。 如果資料物件支援 CFSTR_INDRAGLOOP,則目標可以改用該格式來檢查拖放迴圈的狀態,並避免物件需要大量記憶體轉譯,直到實際卸載為止。 需要大量轉譯的記憶體格式仍應包含在 FORMATETC 列舉值和 IDataObject::QueryGetData的呼叫中。 如果資料物件未設定CFSTR_INDRAGLOOP,它應該會像值設定為零一樣。
5.0 版。此格式識別碼可讓卸載來源呼叫資料物件的 IDataObject::GetData 方法,以判斷 Shell 資料傳輸的結果。 資料是包含全域記憶體物件的 STGMEDIUM 結構。 結構的 hGlobal 成員會指向包含 DROPEFFECT 值的 DWORD。
CFSTR_PERFORMEDDROPEFFECT格式識別碼旨在允許目標向資料物件指出實際發生的作業。 不過,Shell 會盡可能針對檔案系統物件使用 優化的移動 。 在此情況下,Shell 通常會將CFSTR_PERFORMEDDROPEFFECT值設定為 DROPEFFECT_NONE,以向資料物件指出原始資料已刪除。 因此,來源無法使用CFSTR_PERFORMEDDROPEFFECT值來判斷已發生的作業。 雖然大部分的來源不需要這項資訊,但有一些例外狀況。 例如,即使優化移動不需要來源刪除任何資料,來源仍可能需要更新相關的資料庫,以指出檔案已移動或複製。
如果來源需要知道發生的作業,它可以呼叫資料物件的 IDataObject::GetData 方法,並要求CFSTR_LOGICALPERFORMEDDROPEFFECT格式。 此格式基本上會反映作業完成之後,從使用者的觀點來看會發生什麼情況。 如果建立新的檔案並刪除原始檔案,使用者會看到移動作業,且格式的資料值會設定為DROPEFFECT_MOVE。 如果原始檔案仍在該處,使用者會看到複製作業,且格式的資料值會設定為DROPEFFECT_COPY。 如果已建立連結,格式的資料值將會DROPEFFECT_LINK。
目標會使用此格式識別碼,透過其 IDataObject::SetData 方法通知資料物件,刪除貼上作業成功。 資料是包含全域記憶體物件的 STGMEDIUM 結構。 結構的hGlobal成員會指向包含DROPEFFECT值的DWORD。 此格式可用來通知資料物件應該完成剪下作業,並視需要刪除原始資料。 如需詳細資訊,請參閱 刪除貼上作業。
目標會使用此格式識別碼,透過其 IDataObject::SetData 方法通知資料物件資料傳輸的結果。 資料是包含全域記憶體物件的 STGMEDIUM 結構。 結構的hGlobal成員會指向設定為適當DROPEFFECT值的DWORD,通常DROPEFFECT_MOVE或DROPEFFECT_COPY。
當作業的結果可以是移動或複製時,通常會使用此格式,例如在 優化的移動 或刪除貼上作業中。 它提供可靠的方法,讓目標告訴資料物件實際發生的情況。 由於DoDragDrop所傳回的 pdwEffect值並未可靠地指出已執行哪個作業,所以已引進此作業。 CFSTR_PERFORMEDDROPEFFECT格式是指出已進行未優化移動的可靠方式。
來源會使用此格式識別碼來指定其慣用的資料傳輸方法是移動或複製。 卸載目標會呼叫資料物件的 IDataObject::GetData 方法,以要求此格式。 資料是包含全域記憶體物件的 STGMEDIUM 結構。 結構的 hGlobal 成員會指向 DWORD 值。 如果慣用移動作業,或慣用複製作業,則此值會設定為 DROPEFFECT_COPY DROPEFFECT_MOVE。
當來源可以支援移動或複製作業時,就會使用這項功能。 它會使用 CFSTR_PREFERREDDROPEFFECT 格式,將其喜好設定傳達給目標。 因為目標不一定要接受要求,所以目標必須使用CFSTR_PERFORMEDDROPEFFECT格式呼叫來源的IDataObject::SetData方法,以告知資料物件實際執行哪個作業。
使用 貼上刪除 作業時,會使用CFSTR_PREFERREDDROPFORMAT格式來告訴目標來源是否執行剪下或複製。 使用拖放作業,您可以使用CFSTR_PREFERREDDROPFORMAT來指定殼層的動作。 如果這個格式不存在,Shell 會根據內容執行預設動作。 例如,如果使用者從某個磁片區拖曳檔案,並將它放在另一個磁片區上,Shell 的預設動作就是複製檔案。 藉由在資料物件中包含CFSTR_PREFERREDDROPFORMAT格式,您可以覆寫預設動作,並明確地告訴殼層複製、移動或連結檔案。 如果使用者選擇使用右鍵拖曳,CFSTR_PREFERREDDROPFORMAT指定 拖放 快捷方式功能表上的預設命令。 使用者仍可自由選擇功能表上的其他命令。
在 Microsoft Internet Explorer 4.0 之前,應用程式在FILEDESCRIPTOR結構的dwFlags成員中設定FD_LINKUI,指出它正在傳輸快捷方式檔案類型。 然後,目標必須使用 IDataObject::GetData 的可能耗時呼叫,以瞭解是否已設定FD_LINKUI旗標。 現在,指示要傳送快捷方式的慣用方式是使用設定為 DROPEFFECT_LINK 的CFSTR_PREFERREDDROPEFFECT格式。 不過,為了與較舊的系統回溯相容性,來源仍應設定FD_LINKUI旗標。
這個格式識別碼是由目標用來將其 CLSID 提供給來源。 資料是包含全域記憶體物件的 STGMEDIUM 結構。 結構的 hGlobal 成員會指向置放目標的 CLSID GUID。
此格式主要用於允許將物件拖曳至回收站來刪除。 當回收站中卸載物件時,會呼叫來源的 IDataObject::SetData 方法,並將CFSTR_TARGETCLSID格式設定為回收站的 CLSID (CLSID_RecycleBin) 。 然後,來源可以刪除原始物件。
Windows Internet Explorer 和 Windows Shell 會使用此格式識別碼來提供機制,以封鎖或提示來自 Internet Explorer 的拖放作業,並搭配 URLACTION_SHELL_ENHANCED_DRAGDROP_SECURITY 旗標。
CFSTR_UNTRUSTEDDRAGDROP 是由拖放作業的來源新增,以指定資料物件可能包含不受信任的資料。 資料是由包含全域記憶體物件的 STGMEDIUM 結構表示。 結構的hGlobal成員會指向設定為適當URL 動作旗標的DWORD,以使用PUAF_ENFORCERESTRICTED旗標,透過IInternetSecurityManager::P rocessUrlAction方法進行原則檢查。
此格式用於拖放作業,以識別物件的拖曳影像 (視窗) ,以便動態更新其視覺資訊。 當物件拖曳到置放目標上方時,應用程式會更新其 DROPDESCRIPTION 結構,以回應 IDropTarget::D ragOver 或 IDropSource::GiveFeedback 方法。 DROPDESCRIPTION會以新的DROPIMAGETYPE值更新,指出要套用至拖曳視窗視覺效果的裝飾;例如,表示正在複製檔案,而不是移動,或物件無法卸載至該位置。 不過,在物件收到 DDWM_UPDATEWINDOW 訊息之前,不會更新視覺效果。 此格式會將收件者拖曳視窗的 HWND 提供給 DDWM_UPDATEWINDOW 郵件的寄件者。
剪貼簿資料的類型為 TYMED_HGLOBAL。 它是HWND的DWORD標記法。 資料可以傳遞至 Basetsd.h 中定義的 ULongToHandle 函式,以提供 64 位 HWND 以在 64 位 Windows 上使用。
此格式不需要包含 Shlobj.h。