You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 04:10:27