为何Clipboard.SetDataObject无法恢复原始剪贴板内容?
剪贴板恢复为空的问题解决
问题原因
你直接保存Clipboard.GetDataObject()返回的IDataObject对象不可靠——这个对象是剪贴板的临时引用,当调用Clipboard.SetText修改剪贴板内容后,原始的IDataObject会失效,无法再读取之前的数据,后续调用Clipboard.SetDataObject(oldClipboard)时没有有效数据可写入,导致剪贴板为空。
修复方案
不要直接保存原始的IDataObject,而是创建新的DataObject,把原始剪贴板里的所有数据格式和对应内容复制进去,持久化保存原始数据。修改后的代码如下:
using System.Windows.Forms; using System.Collections; public class ExplorerTools { public void Run() { // 持久化保存原始剪贴板的所有数据 var oldClipboardData = new DataObject(); var originalData = Clipboard.GetDataObject(); if (originalData != null) { // 遍历所有数据格式,复制到新的DataObject中 foreach (var format in originalData.GetFormats()) { if (originalData.GetDataPresent(format)) { oldClipboardData.SetData(format, originalData.GetData(format)); } } } // 临时修改剪贴板内容 Clipboard.SetText("My Useful Text"); System.Threading.Thread.Sleep(400); // 恢复原始剪贴板数据 if (oldClipboardData.GetFormats().Length > 0) { Clipboard.SetDataObject(oldClipboardData, true); } // 原始剪贴板为空时无需额外处理 } }
关键说明
- 新建
DataObject并复制所有格式数据,确保原始内容不受后续剪贴板修改影响,完整保留 Clipboard.SetDataObject的第二个参数设为true,可让数据在程序退出后依然保留在剪贴板(可选,更贴合常规使用场景)- 增加空值判断,避免原始剪贴板为空时触发异常
内容的提问来源于stack exchange,提问作者nitrateag
相关产品推荐
相关产品推荐

