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。
剪贴板类只能在设置为单线程单元 (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();