如何在Explorer和TcxShellListView之间实现无缝剪贴?

时间:2013-01-25 10:18:13

标签: delphi devexpress delphi-xe2 clipboard explorer

我有一个模仿Windows资源管理器的应用程序,它在其他shell控件中使用TcxShellListView

一个非常好的功能是在真正的Windows资源管理器和我的应用程序之间能够Copy & PasteCut & Paste个文件。

Drag & Drop已经开箱即用,但似乎DevExpress尚未实现剪贴板方面。

任何想法?

1 个答案:

答案 0 :(得分:3)

如果您想自己实现复制/粘贴,则该机制几乎与拖放相同。您拥有的拖放代码将创建IDataObject。要复制,而不是致电DoDragDrop来发起拖动,只需致电OleSetClipboard即可通过IDataObject。对于粘贴,请致电OleGetClipboard以从剪贴板中获取IDataObject。然后,您只需使用与放置操作完全相同的代码来解码IDataObject。这就是它的全部内容。

还有另一种方法可以做到,在我看来可能是一种更好的方法。这就是使用IContextMenu来完成工作。其中的例子可以在TurboPower tpShellShock项目中找到。查看ShellMenuExecute单元中的StShlCtl。只要DevExpress组件使用shell接口,即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;

我认为您应该可以使用此代码。我会指出handle参数声明不正确。它应该是HWND。它被用作调用InvokeCommand期间显示的任何对话框的拥有窗口。