2

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

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

Drag & Drop已经开箱即用,但似乎 DevExpress 还没有实现剪贴板端。

有任何想法吗?

4

1 回答 1

3

如果您想自己实现复制/粘贴,该机制几乎与拖放相同。您拥有的拖放代码将创建一个IDataObject. 要复制,而不是调用DoDragDrop启动拖动,只需调用OleSetClipboard传递IDataObject. 对于粘贴,您可以调用从剪贴板OleGetClipboard中获取。IDataObject然后您只需使用与拖放操作完全相同的代码来解码IDataObject. 这里的所有都是它的。

还有另一种方法可以做到这一点,在我看来可能是更好的方法。那就是用来IContextMenu做工作。在 TurboPower tpShellShock 项目中可以找到这方面的示例。ShellMenuExecuteStShlCtl单位里找。只要 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;

我认为您应该能够按原样使用此代码。我会指出句柄参数声明不正确。应该是HWND。它用作在调用InvokeCommand.

于 2013-01-25T10:25:12.460 回答