Clipboard.SetFileDropList不能正常工作

时间:2014-11-15 21:22:01

标签: 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));

Clipboard.Clear();
Clipboard.SetFileDropList(stC);

当我进入调试模式并在我的方法中放置一个断点时,一切正常并且剪贴板已更新,但当我的方法结束时(我的文件夹没有明显破坏),剪贴板中的内容不可用。

一些想法?

修改

如果我在退出之前用消息框中断执行它会起作用,否则它不起作用。 我尝试使用SetData对象,但它是一样的。

编辑2:

文件列表似乎已进入剪贴板,但系统中禁用了粘贴。

编辑3:

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

1 个答案:

答案 0 :(得分:0)

Clipboard类只能在设置为单线程单元(STA)模式的线程中使用。 执行此操作的选项是

  1. 使用STAThreadAttribute属性标记Main方法。
  2. OR

    1. 从您的应用程序创建一个STA线程并使用剪贴板
    2. 选项#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();