gpt4 book ai didi

delphi - Explorer和TcxShellListView之间如何实现无缝剪贴板?

转载 作者:行者123 更新时间:2023-12-03 18:32:33 25 4
gpt4 key购买 nike

我有一个模仿 Windows Explorer 的应用程序,它使用 TcxShellListView在其他外壳控件中。

一个非常好的功能是能够 Copy & PasteCut & Paste真正的 Windows 资源管理器和我的应用程序之间的文件。
Drag & Drop已经开箱即用,但似乎 DevExpress 还没有实现剪贴板端。

有任何想法吗?

最佳答案

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

还有另一种方法可以做到这一点,在我看来可能是更好的方法。那就是使用 IContextMenu做这项工作。在 TurboPower tpShellShock 项目中可以找到这方面的示例。看看ShellMenuExecuteStShlCtl单元。只要 DevExpress 组件使用 shell 接口(interface),即 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 期间显示的任何对话框的拥有窗口。 .

关于delphi - Explorer和TcxShellListView之间如何实现无缝剪贴板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14519692/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com