为什么在远程桌面上使用Clipboard.GetFileDropList()返回一个空集合?

5

我有一个程序,需要能够从远程计算机复制和粘贴到我的本地计算机。

我的问题是,当我使用

Clipboard.GetDropList();

它返回一个包含0个元素的集合,无论我尝试复制多少个元素。
我已经尝试过以下方法:
if (Clipboard.ContainsFileDropList())
{
    foreach (string item in Clipboard.GetFileDropList())
    {
        File.Copy(item, path + '\\' + Path.GetFileName(item));
    }
}

我也尝试过(BoltBait的答案):

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();

两个版本都返回一个空集合。

问题可能来自哪里?已知:

  • 从远程复制/粘贴到本地(通过Windows)可以工作
  • 从本地复制/粘贴到本地(通过代码)可以工作
  • 剪贴板共享已激活
  • 操作系统(本地):Windows 10
  • 操作系统(远程):Windows Server 2008 R2
1个回答

2
您得到空集合的原因是剪贴板中不包含任何DataFormats.FileDrop格式的数据。
相反,通过远程桌面复制一些文件(启用了剪贴板共享)在远程机器上,文件内容将直接放置在剪贴板中。剪贴板将包含以下格式的数据: 理论上,您可以尝试迭代遍历FILEGROUPDESCRIPTOR对象,并存储每个文件从剪贴板读取其CFSTR_FILECONTENTS。但我发现一个错误报告描述了这在Windows Forms中仅适用于第一个文件。因此,您将不得不通过调用本地方法来使用P/Invoke实现它。

当我尝试访问FileContents时,我会收到一个异常(CLIPBRD_E_BAD_DATA HRESULT: 0x800401D3)(我正在使用GetData(“FileContents”))。是否有其他方法我应该使用? - user3399
不幸的是,.NET中的Clipboard实现对此支持不够好。您必须切换到非托管方法 - 通过P/Invoke或创建自己的非托管模块。有关详细信息,请参见此主题 - dymanoid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接