我有一個模仿Windows資源管理器的應用程序,它在其他shell控件中使用TcxShellListView
。如何在Explorer和TcxShellListView之間實現無縫剪貼板?
一個非常好的功能是能夠在真正的Windows資源管理器和我的應用程序之間生成Copy & Paste
和Cut & Paste
文件。
Drag & Drop
已經開箱即用,但似乎DevExpress尚未實現剪貼板方面。
任何想法?
我有一個模仿Windows資源管理器的應用程序,它在其他shell控件中使用TcxShellListView
。如何在Explorer和TcxShellListView之間實現無縫剪貼板?
一個非常好的功能是能夠在真正的Windows資源管理器和我的應用程序之間生成Copy & Paste
和Cut & Paste
文件。
Drag & Drop
已經開箱即用,但似乎DevExpress尚未實現剪貼板方面。
任何想法?
如果您想自己執行復制/粘貼操作,則該機制與拖放操作幾乎完全相同。您擁有的拖放代碼將創建一個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
期間顯示的任何對話框的擁有窗口。