我试图获取从剪贴板复制的文件列表。 我充分意识到,WPF有这种内置的方法,但是对我来说,使用API,因为WPF的实现剪贴板的是越野车,因为在网络上描述的很多地方是很重要的。
到目前为止,我现在用的是GetClipboardData
函数返回一个指针,我需要在内存中的数据。 现在,通过这个数据一一列举,我想通了,我需要使用DragQueryFile
API在Windows中。
我DragQueryFile
API声明如下。
[DllImport("shell32.dll", CharSet = CharSet.Auto)]
private static extern int DragQueryFile(IntPtr hDrop, int iFile, StringBuilder lpszFile, int cch);
而我GetClipboardData
API声明如下。
[DllImport("user32.dll")]
static extern IntPtr GetClipboardData(uint uFormat);
现在,如果你看看在为DragQueryFile API文档 ,它明确规定关于函数的参数如下:
iFile的:该文件的索引查询。 如果这个参数的值是0xFFFFFFFF的,DragQueryFile返回的文件的数量下降 。 如果这个参数的值是零之间和文件的总数减少,DragQueryFile副本与相应的值到缓冲区中的文件名指向的lpszFile参数。
我已经使用这个信息,并已组成这段代码(你可以复制,粘贴,它应该也对你的最终运行)。
var dummyFiles = new StringCollection();
dummyFiles.Add(Path.GetTempFileName());
dummyFiles.Add(Path.GetTempFileName());
Clipboard.Clear();
Clipboard.SetFileDropList(dummyFiles);
var dataPointer = GetClipboardData(15); //15 is for CF_HDROP datatype - this does in fact return a pointer, so it's working fine
var fileCount = DragQueryFile(dataPointer, -1, null, 0);
在上面的例子中, fileCount
始终是0
,但我只是说2个文件复制到剪贴板,而且我可以通过获取它们Clipboard.GetFileDropList
在WPF功能就好了。 我也查了,如果格式15(CF_HDROP)确实是在剪贴板上,它是。