为什么 Clipboard.GetFileDropList() returns 是远程桌面上的一个空集合?
Why Clipboard.GetFileDropList() returns an empty collection on Remote Desktop?
我有一个程序需要能够从远程计算机复制并粘贴到我的本地计算机。
我的问题是,当我使用
Clipboard.GetDropList();
它return是一个包含 0 个元素的集合,无论我试图复制多少元素。
我试过:
if (Clipboard.ContainsFileDropList())
{
foreach (string item in Clipboard.GetFileDropList())
{
File.Copy(item, path + '\' + Path.GetFileName(item));
}
}
我也试过了(BoltBait's answer):
System.Collections.Specialized.StringCollection idat = null;
Exception threadEx = null;
Thread staThread = new Thread(
delegate ()
{
try
{
idat = Clipboard.GetFileDropList();
}
catch (Exception ex)
{
threadEx = ex;
}
});
staThread.SetApartmentState(ApartmentState.STA);
staThread.Start();
staThread.Join();
两个版本return一个空集合。
问题可能来自哪里?知道:
- Copy/Pasting 从远程到本地(通过 windows)有效
- Copy/Pasting 从本地到本地(通过代码)有效
- 剪贴板共享已激活
- OS(本地):Windows 10
- OS(远程):Windows Server 2008 R2
您得到空集合的原因是剪贴板不包含任何 DataFormats.FileDrop
格式的数据。
相反,在通过远程桌面复制远程计算机上的一些文件时(启用剪贴板共享时),文件内容将直接放在剪贴板中。剪贴板将包含以下格式的数据:
FILEGROUPDESCRIPTOR
(实际上,FILEGROUPDESCRIPTORA
或 FILEGROUPDESCRIPTORW
,在您的系统上 - 第二个)
CFSTR_FILECONTENTS
CFSTR_PREFERREDDROPEFFECT
因此理论上您可以尝试遍历 FILEGROUPDESCRIPTOR
对象并存储从剪贴板读取其 CFSTR_FILECONTENTS
的每个文件。
但我发现 bug report 描述这仅适用于 Windows 表单中的第一个文件。因此,您必须通过调用本机方法使用 P/Invoke 来实现它。
我有一个程序需要能够从远程计算机复制并粘贴到我的本地计算机。
我的问题是,当我使用
Clipboard.GetDropList();
它return是一个包含 0 个元素的集合,无论我试图复制多少元素。
我试过:
if (Clipboard.ContainsFileDropList())
{
foreach (string item in Clipboard.GetFileDropList())
{
File.Copy(item, path + '\' + Path.GetFileName(item));
}
}
我也试过了(BoltBait's answer):
System.Collections.Specialized.StringCollection idat = null;
Exception threadEx = null;
Thread staThread = new Thread(
delegate ()
{
try
{
idat = Clipboard.GetFileDropList();
}
catch (Exception ex)
{
threadEx = ex;
}
});
staThread.SetApartmentState(ApartmentState.STA);
staThread.Start();
staThread.Join();
两个版本return一个空集合。
问题可能来自哪里?知道:
- Copy/Pasting 从远程到本地(通过 windows)有效
- Copy/Pasting 从本地到本地(通过代码)有效
- 剪贴板共享已激活
- OS(本地):Windows 10
- OS(远程):Windows Server 2008 R2
您得到空集合的原因是剪贴板不包含任何 DataFormats.FileDrop
格式的数据。
相反,在通过远程桌面复制远程计算机上的一些文件时(启用剪贴板共享时),文件内容将直接放在剪贴板中。剪贴板将包含以下格式的数据:
FILEGROUPDESCRIPTOR
(实际上,FILEGROUPDESCRIPTORA
或FILEGROUPDESCRIPTORW
,在您的系统上 - 第二个)CFSTR_FILECONTENTS
CFSTR_PREFERREDDROPEFFECT
因此理论上您可以尝试遍历 FILEGROUPDESCRIPTOR
对象并存储从剪贴板读取其 CFSTR_FILECONTENTS
的每个文件。
但我发现 bug report 描述这仅适用于 Windows 表单中的第一个文件。因此,您必须通过调用本机方法使用 P/Invoke 来实现它。