如何以符合系统标准的形式以编程方式从 Windows 剪贴板剪切/复制/获取文件?

Iva*_*van 5 .net clipboard winapi file

  1. 如何将特定文件和/或文件夹的剪切/复制引用放入 Windows 剪贴板,以便当我打开标准的 Windows 资源管理器窗口时,转到某处并按Ctrl+ V- 粘贴文件?

  2. 如果我在 Windows 资源管理器中复制或剪切了一些文件/文件夹,我如何在我的程序中获取这些信息(全名以及它们是否被剪切或复制)?

我用C# 4.0编程,但其他语言的方式也很有趣。

Han*_*ant 5

我有 90% 的解决方案,从剪贴板格式和我在这个线程中的答案逆向工程。您需要设置两个剪贴板数据。文件列表,这很容易做到。还有另一种名为“Preferred Dropeffect”的剪贴板格式,指示是请求文件的副本还是移动。导致此代码:

    public static void StartCopyFiles(IList<string> files, bool copy) {
        var obj = new DataObject();
        // File list first
        var coll = new System.Collections.Specialized.StringCollection();
        coll.AddRange(files.ToArray());
        obj.SetFileDropList(coll);
        // Then the operation
        var strm = new System.IO.MemoryStream();
        strm.WriteByte(copy ? (byte)DragDropEffects.Copy : (byte)DragDropEffects.Move);
        obj.SetData("Preferred Dropeffect", strm);
        Clipboard.SetDataObject(obj);
    }
Run Code Online (Sandbox Code Playgroud)

示例用法:

        var files = new List<string>() { @"c:\temp\test1.txt", @"c:\temp\test2.txt" };
        StartCopyFiles(files, true);
Run Code Online (Sandbox Code Playgroud)

在 Windows 资源管理器中按 Ctrl+V 从我的 c:\temp 目录复制文件。

我无法进行的是“剪切”操作,将 false 传递给 StartCopyFiles() 产生了复制操作,原始文件未从源目录中删除。不知道为什么,应该有效。我认为“Preferred DropEffects”的实际流格式更漂亮,可能涉及臭名昭著的PIDL。

  • 对于找到此答案的任何人:剪切和粘贴不起作用,因为您需要支持“优化移动操作”或“粘贴时删除操作”。检查此链接了解详细信息http://msdn.microsoft.com/en-us/library/windows/desktop/bb776904(v=vs.85).aspx#delete_on_paste (2认同)

Han*_*son 1

如果您使用的是Windows 窗体,请查看System.Windows.Forms.Clipboard。我认为应该能够做到这一点。我不知道如何做你想做的事情,因为我从来没有研究过它,但我会首先看看 FileDropList 方法(GetFileDropList等),因为它们看起来很有希望。

如果您需要查明它是副本还是剪切以及类似的更详细信息,似乎您必须使用IDataObject接口。