C# Clipboard操作指南:读取与自定义序列化数据传输

Nora
Nora
发布时间:2026-10-13 | 2人浏览过
原创

本文介绍如何在C#中操作Windows剪切板,包括注册窗口以实时获取剪切板更新、读取标准文本或图像数据,以及如何利用序列化机制存储和检索自定义数据类型。

核心原理与操作流程

在C#中操作剪切板通常涉及以下几个关键步骤:定义可序列化的数据格式、构建数据对象、写入剪切板以及从剪切板读取数据。为了实现更高级的交互(如实时监听),还需要结合Windows消息机制进行回调处理。

第1步:准备可序列化的数据结构

若需将自定义对象存入剪切板,该类必须标记为可序列化。使用 [Serializable] 属性即可满足此要求。如果类中存在不需要持久化或传输的字段,可使用 [NonSerialized()] 进行排除。

[Serializable]
public class MyItem
{
    public string ItemName { get; private set; }
    // 其他成员...
}

第2步:注册剪切板查看器以监听变化

为了让程序在用户复制其他内容时能实时检测到剪切板的变化,需要调用 user32.dll 中的 SetClipboardViewer API将当前窗口加入观察链。这允许接收 WM_DRAWCLIPBOARD 消息。

第3步:处理Windows消息并读取数据

重写窗口的 WndProc 方法来拦截消息。当收到 WM_DRAWCLIPBOARD 时,首先通过API传递消息给链中的下一个观察者,然后检查当前剪切板内容。

  • 检测文本: 使用 GetDataPresent(DataFormats.Text) 验证,并通过 GetData() 获取字符串。
  • 检测图像: 使用 Clipboard.GetImage() 直接获取 Bitmap 对象。
  • 检测自定义类型: 使用 typeof(MyItem).FullName 作为格式标识进行匹配。
protected override void WndProc(ref System.Windows.Forms.Message m)
{
    if (m.Msg == WM_DRAWCLIPBOARD)
    {
        // 传递消息以保持观察者链畅通
        SendMessage(NextClipHwnd, m.Msg, m.WParam, m.LParam);
        
        IDataObject iData = Clipboard.GetDataObject();
        
        // 示例:处理自定义对象
        if (iData.GetDataPresent(typeof(MyItem).FullName))
        {
            MyItem item = GetFromClipboard();
            if (item != null) UpdateUI(item);
        }
    }
    else
    {
        base.WndProc(ref m);
    }
}

第4步:写入自定义数据到剪切板

要将自定义对象复制到剪切板,需创建 DataObject 实例,并使用 SetData 方法指定格式名称和对象本身。最后调用 Clipboard.SetDataObject 提交数据。

public void CopyToClipboard()
{
    DataFormats.Format format = DataFormats.GetFormat(typeof(MyItem).FullName);
    IDataObject dataObj = new DataObject();
    dataObj.SetData(format.Name, false, this); // false表示不保持存活期
    Clipboard.SetDataObject(dataObj, false);
}

清理资源

在应用程序关闭时,务必调用 ChangeClipboardChain 从观察链中移除当前窗口,防止系统出现异常,并传递链变动消息。

以上就是C#操作Clipboard读取与写入剪切板中数据的详细内容,更多关于C#剪切板开发的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表