2017-09-13 117 views
2

我有一个程序,我需要能够从远程计算机复制和粘贴到我的本地计算机。为什么Clipboard.GetFileDropList()在远程桌面上返回一个空集合?

我的问题是,当我使用

Clipboard.GetDropList(); 

则返回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(); 

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

问题从何而来?知道了:

  • 复制/粘贴从远程到本地(通过Windows)的作品
  • 复制/从局部与局部之间(通过代码)的作品
  • 剪贴板共享粘贴激活
  • OS(本地) :视窗10
  • OS(远程):在Windows Server 2008 R2

回答

0

为什么你得到一个空集是剪贴板中不包含任何数据的事实,我之所以n格式为DataFormats.FileDrop

而是,通过远程桌面复制远程计算机上的某些文件(启用剪贴板共享时),文件内容将直接放置在剪贴板中。剪贴板将包含以下格式的数据:

所以理论上你可以尝试遍历FILEGROUPDESCRIPTOR对象,并将每个文件从剪贴板中读取其CFSTR_FILECONTENTS

但我发现一个bug report描述这只适用于Windows窗体中的第一个文件。所以你必须通过调用本地方法来使用P/Invoke来实现它。

+0

当我尝试访问FileContents时,出现异常(CLIPBRD_E_BAD_DATA HRESULT:0x800401D3)(我正在使用GetData(“FileContents”))。我应该使用另一种方法吗? – user3399

+0

不幸的是,.NET中'剪贴板“的实现并不能很好地支持这一点。您必须切换到非托管方法 - 通过P/Invoke或创建您自己的非托管模块。有关详细信息,请参阅[本主题](https://msdn.microsoft.com/zh-cn/library/windows/desktop/bb776904%28v=vs.85%29.aspx#filecontents)。 – dymanoid

相关问题