C# Clipboard操作指南:读取与自定义序列化数据传输
本文介绍如何在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#剪切板开发的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









