当我试图让文件数DragQueryFile返回0?(DragQueryFile returns 0

2019-10-17 02:28发布

我试图获取从剪贴板复制的文件列表。 我充分意识到,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)确实是在剪贴板上,它是。

Answer 1:

我不得不打电话OpenClipboard(因此我也叫CloseClipboard)以连得对Win7的X64从GetclipboardData返回值。

我加

[DllImport("user32.dll", SetLastError = true)]
static extern bool OpenClipboard(IntPtr hWndNewOwner);

[DllImport("user32.dll", SetLastError = true)]
static extern bool CloseClipboard();

并改变了DragQueryFile匹配我对pinvoke.net发现(UINT的不是int)

[DllImport("shell32.dll", CharSet = CharSet.Auto)]
private static extern int DragQueryFile(IntPtr hDrop, uint iFile, StringBuilder lpszFile, int cch);

并使用

    var dummyFiles = new StringCollection();
    dummyFiles.Add(Path.GetTempFileName());
    dummyFiles.Add(Path.GetTempFileName());

    Clipboard.Clear();
    Clipboard.SetFileDropList(dummyFiles);   

    OpenClipboard(IntPtr.Zero);

    IntPtr hDrop = GetClipboardData(15);

    var count = DragQueryFile(hDrop, uint.MaxValue, null, 0);

    // etc.

    CloseClipboard();

奋力(计数= 2)对我来说。



文章来源: DragQueryFile returns 0 when I try to get file count?
标签: c# wpf clipboard