我正在寻找一种方法以编程下调一档至剪贴板,例如,一些呼吁在C#中的函数,做同样的作为Windows Explorer选择一个文件,然后按Ctrl键 + X。剪切文件在C#中剪贴板
运行程序,按下Ctrl键+V在硬盘上的其他文件夹后,原来的文件将是移动到新文件夹。通过查看堆栈溢出问题Copy files to clipboard in C#,我知道这是很容易做到的复印作业,但切割似乎工作不同。我怎样才能做到这一点?
我正在寻找一种方法以编程下调一档至剪贴板,例如,一些呼吁在C#中的函数,做同样的作为Windows Explorer选择一个文件,然后按Ctrl键 + X。剪切文件在C#中剪贴板
运行程序,按下Ctrl键+V在硬盘上的其他文件夹后,原来的文件将是移动到新文件夹。通过查看堆栈溢出问题Copy files to clipboard in C#,我知道这是很容易做到的复印作业,但切割似乎工作不同。我怎样才能做到这一点?
请尝试以下方法,从The Code Project文章翻译Setting the Clipboard File DropList with DropEffect in VB.NET:
byte[] moveEffect = new byte[] {2, 0, 0, 0};
MemoryStream dropEffect = new MemoryStream();
dropEffect.Write(moveEffect, 0, moveEffect.Length);
DataObject data = new DataObject();
data.SetFileDropList(files);
data.SetData("Preferred DropEffect", dropEffect);
Clipboard.Clear();
Clipboard.SetDataObject(data, true);
只是为了看看会发生什么,我有一个DragDropEffects这样取代了MemoryStream:
data.SetData("FileDrop", files);
data.SetData("Preferred DropEffect", DragDropEffects.Move);
显然,它可以作为真正的剪辑而不是复制! (这是在Windows 7 - 我还没有尝试其他操作系统)。不幸的是,它只能巧合使用。例如,
data.SetData("Preferred DropEffect", DragDropEffects.Copy);
不会产生副本(仍是剪切)。看起来非空导致切割,空副本。
看我的答案,它使用DragDropEffects枚举。 –
我想换这样的代码是有道理的的API中。我也喜欢在可以的情况下避免魔术字节串。
我想出了这个扩展方法,它解决了@Keith在他的回答中面临的谜题,有效地使用了DragDropEffects
枚举。
public static class Extensions
{
public static void PutFilesOnClipboard(this IEnumerable<FileSystemInfo> filesAndFolders, bool moveFilesOnPaste = false)
{
var dropEffect = moveFilesOnPaste ? DragDropEffects.Move : DragDropEffects.Copy;
var droplist = new StringCollection();
droplist.AddRange(filesAndFolders.Select(x=>x.FullName).ToArray());
var data = new DataObject();
data.SetFileDropList(droplist);
data.SetData("Preferred Dropeffect", new MemoryStream(BitConverter.GetBytes((int)dropEffect)));
Clipboard.SetDataObject(data);
}
}
是的,我确实意味着 “数据”。 –
完美的作品,谢谢! :) – friederbluemle
谢谢,我试图用'Clipboard.SetFileDropList'并且它抛出一个异常,而是你的方法就像一个魅力! –