Clipboard.SetFileDropList 无法正常工作

本文关键字:工作 常工作 SetFileDropList Clipboard | 更新日期: 2023-09-27 18:30:34

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

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。

Clipboard.SetFileDropList 无法正常工作

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

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

  1. 从应用程序创建 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();