Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当我尝试获取文件计数时,DragQueryFile返回0?_C#_Wpf_Clipboard - Fatal编程技术网

C# 当我尝试获取文件计数时,DragQueryFile返回0?

C# 当我尝试获取文件计数时,DragQueryFile返回0?,c#,wpf,clipboard,C#,Wpf,Clipboard,我正在尝试从剪贴板中获取复制文件的列表。我很清楚WPF为此内置了一些方法,但对我来说使用API是很重要的,因为WPF对剪贴板的实现是有缺陷的,正如web上许多地方所描述的那样 到目前为止,我使用的是GetClipboardData函数,它返回指向内存中所需数据的指针。现在,为了枚举这些数据,我发现我需要在Windows中使用DragQueryFileAPI 我的DragQueryFileAPI声明如下 [DllImport("shell32.dll", CharSet = CharSet.Aut

我正在尝试从剪贴板中获取复制文件的列表。我很清楚WPF为此内置了一些方法,但对我来说使用API是很重要的,因为WPF对剪贴板的实现是有缺陷的,正如web上许多地方所描述的那样

到目前为止,我使用的是
GetClipboardData
函数,它返回指向内存中所需数据的指针。现在,为了枚举这些数据,我发现我需要在Windows中使用
DragQueryFile
API

我的
DragQueryFile
API声明如下

[DllImport("shell32.dll", CharSet = CharSet.Auto)]
private static extern int DragQueryFile(IntPtr hDrop, int iFile, StringBuilder lpszFile, int cch);
[DllImport("user32.dll")]
static extern IntPtr GetClipboardData(uint uFormat);
我的
GetClipboardData
API声明如下

[DllImport("shell32.dll", CharSet = CharSet.Auto)]
private static extern int DragQueryFile(IntPtr hDrop, int iFile, StringBuilder lpszFile, int cch);
[DllImport("user32.dll")]
static extern IntPtr GetClipboardData(uint uFormat);
现在,如果您看一下,它清楚地说明了函数中参数的以下内容:

iFile:要查询的文件的索引如果此参数的值为0xFFFFFF,则DragQueryFile返回已删除文件的计数。如果此参数的值介于零和丢弃的文件总数之间,则DragQueryFile会将具有相应值的文件名复制到lpszFile参数指向的缓冲区

我使用了这些信息,并编写了这段代码(您可以复制粘贴它,它也应该在您的终端上运行)


在上面的示例中,
fileCount
始终是
0
,尽管我刚刚向剪贴板添加了两个文件,并且我可以通过WPF中的
clipboard.getFiledList
函数来获取它们。我还检查了格式15(CF_HDROP)是否确实在剪贴板中,它确实在剪贴板中。

我必须调用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)

和使用

    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)。

我必须调用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)

和使用

    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)。

我也需要帮助。我也遇到了同样的问题,尽管我的声明略有不同。在VB.NET联机中,C++中有大量的示例。但是一经转换,它们都不起作用。我也需要帮助。我也遇到了同样的问题,尽管我的声明略有不同。在VB.NET联机中,C++中有大量的示例。但一旦转换,它们都无法工作。