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