2013-01-25 28 views
2

我有一個模仿Windows資源管理器的應用程序,它在其他shell控件中使用TcxShellListView如何在Explorer和TcxShellListView之間實現無縫剪貼板?

一個非常好的功能是能夠在真正的Windows資源管理器和我的應用程序之間生成Copy & PasteCut & Paste文件。

Drag & Drop已經開箱即用,但似乎DevExpress尚未實現剪貼板方面。

任何想法?

回答

3

如果您想自己執行復制/粘貼操作,則該機制與拖放操作幾乎完全相同。您擁有的拖放代碼將創建一個IDataObject。要複製,不要致電DoDragDrop發起拖動,只需撥打OleSetClipboard即可通過IDataObject。並粘貼您撥打OleGetClipboard從剪貼板獲取IDataObject。然後,您只需使用與下拉操作完全相同的代碼來解碼IDataObject。這裏的所有都是它的。

還有另一種方法可以做到這一點,在我看來可能是更好的方法。那就是使用IContextMenu來完成這項工作。這個例子可以在TurboPower tpShellShock項目中找到。請在StShlCtl單位查找ShellMenuExecute。只要DevExpress組件使用外殼接口,即IShellFolder,那麼您將能夠使用相同的方法。這種基於shell的方法的優點是你可以獲得shell來完成這項工作。如果需要顯示覆制對話框,那麼shell會這樣做。這將爲您提供最完整的用戶體驗。

此代碼如下所示:

procedure ShellMenuExecute(
    const Sender : TObject; const Folder : IShellFolder; 
    var Pidl : PItemIDList; const Count : Integer; 
    const AHandle : THandle; ClipboardAction : TStMenuAction); 
var 
    CM : IContextMenu; 
    CI : TCmInvokeCommandInfo; 
begin 
    if Folder <> nil then begin 
    if (Folder.GetUIObjectOf(AHandle, Count, Pidl, 
     IID_IContextMenu, nil, Pointer(CM)) = NOERROR) 
    then begin 
     ZeroMemory(@CI, SizeOf(CI)); 
     CI.cbSize := SizeOf(TCmInvokeCommandInfo); 
     CI.hwnd := AHandle; 
     case ClipboardAction of 
     caCut : CI.lpVerb := 'cut'; 
     caCopy : CI.lpVerb := 'copy'; 
     caPaste : CI.lpVerb := 'paste'; 
     caProperties : CI.lpVerb := 'properties'; 
     end; 
     CM.InvokeCommand(CI); 
     CM := nil; 
    end; 
    end; 
end; 

我想你應該能夠幾乎原樣使用此代碼。我會指出句柄參數被錯誤地聲明。它應該是HWND。它被用作在調用InvokeCommand期間顯示的任何對話框的擁有窗口。