C# Clipboard.SetFileDropList不';我工作不好

C# Clipboard.SetFileDropList不';我工作不好,c#,wpf,clipboard,C#,Wpf,Clipboard,我在更改剪贴板内容的方法中有一些代码行: System.Collections.Specialized.StringCollection stC = new System.Collections.Specialized.StringCollection(); stC.AddRange(System.IO.Directory.GetDirectories(tempPath)); stC.AddRange(System.IO.Directory.GetFiles(tempPath)); Clipb

我在更改剪贴板内容的方法中有一些代码行:

System.Collections.Specialized.StringCollection stC = new System.Collections.Specialized.StringCollection();
stC.AddRange(System.IO.Directory.GetDirectories(tempPath));
stC.AddRange(System.IO.Directory.GetFiles(tempPath));

Clipboard.Clear();
Clipboard.SetFileDropList(stC);
当我进入调试模式并在我的方法中设置断点时,一切正常,剪贴板也会更新,但当我的方法结束时,剪贴板中的内容不可用(我的文件夹没有被明显破坏)

一些想法

编辑:

如果我在退出前用消息框中断执行,它将工作,否则它将不工作。 我尝试使用SetData对象,但它是相同的

编辑2:

filedroplist似乎已进入剪贴板,但系统中已禁用粘贴

编辑3:


我想我已经发现了问题:唯一的原因可能是因为应用程序拥有剪贴板的所有权,并且在关闭之前不会释放它,因此它不允许实际内容的外部使用。唯一的方法是调用win32 Dll。

剪贴板类只能在设置为单线程单元(STA)模式的线程中使用。 这样做的选项是

  • 使用STAThreadAttribute标记Main方法

  • 从应用程序创建STA线程并使用剪贴板
  • 选项2的示例代码

    System.Collections.Specialized.StringCollection stC = new System.Collections.Specialized.StringCollection();
    stC.AddRange(System.IO.Directory.GetDirectories(tempPath));
    stC.AddRange(System.IO.Directory.GetFiles(tempPath));
    
    //Clipboard.Clear(); //No need to Call this.
    
    //>Call from an STA thread
    Thread t = new Thread(() => { 
                                  Clipboard.SetFileDropList(stC); 
                                });
    t.SetApartmentState(ApartmentState.STA);
    t.Start();
    

    最后一句话“我的文件夹未被明显销毁”是什么意思?当方法关闭时,包含我设置到stringcollection stC中的文件的文件夹tempPath也仍然有效。您如何验证剪贴板的内容不包含您的文件下拉列表?因为如果我“粘贴”方法结束后,它将被禁用。我认为还有更多的问题: