use*_*399 5 c# clipboard remote-desktop
我有一个程序,我需要能够将其从远程计算机复制并粘贴到本地计算机。
我的问题是,当我使用
Clipboard.GetDropList();
Run Code Online (Sandbox Code Playgroud)
无论我尝试复制多少元素,它都会返回一个包含 0 个元素的集合。
我尝试过:
if (Clipboard.ContainsFileDropList())
{
foreach (string item in Clipboard.GetFileDropList())
{
File.Copy(item, path + '\\' + Path.GetFileName(item));
}
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过(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();
Run Code Online (Sandbox Code Playgroud)
两个版本都返回一个空集合。
问题可能从何而来?知道:
得到空集合的原因是剪贴板不包含该DataFormats.FileDrop格式的任何数据。
相反,通过远程桌面复制远程计算机上的某些文件时(启用剪贴板共享时),文件内容将直接放置在剪贴板中。剪贴板将包含以下格式的数据:
FILEGROUPDESCRIPTOR(实际上,FILEGROUPDESCRIPTORA或者FILEGROUPDESCRIPTORW,在您的系统上 - 第二个)CFSTR_FILECONTENTSCFSTR_PREFERREDDROPEFFECT因此,理论上您可以尝试迭代对象并存储从剪贴板FILEGROUPDESCRIPTOR读取的每个文件。CFSTR_FILECONTENTS
但我发现一个错误报告描述这仅适用于 Windows 窗体中的第一个文件。因此,您必须使用 P/Invoke 通过调用本机方法来实现它。