C#操作Clipboard读取剪切板中数据实例详解

 更新时间:2015年05月25日 09:44:08   作者:陌香  
这篇文章主要介绍了C#操作Clipboard读取剪切板中数据的方法,实例分析了C#读取剪贴板数据的具体步骤与实现技巧,需要的朋友可以参考下

本文实例讲述了C#操作Clipboard读取剪切板中数据的方法。分享给大家供大家参考。具体分析如下:

1 自定义一个类,并且保证它的可序列化的:实现ISerializable接口;或者用[Serializable]标记(如果有父类,则父类也需要被标记;可以[NonSerialized()]标记类中不想被序列化的字段)

2 注册自定义数据格式:调用静态方法DataFormats.GetFormat()

3 保存数据到clipboard:利用IdataObject接口,创建一个数据对象,并设置数据;调用Clipboard.SetDataObject()方法

4 从clipboard获取数据:调用DataObject 实例的GetDataPresent()保证数据格式与应用程序兼容;调用IDataObject 的GetData()方法获取数据

示例程序:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.Serialization.Formatters.Binary;
namespace _ClipboardTest_
{
public partial class Form1 : Form
{
[System.Runtime.InteropServices.DllImport("user32")]
private static extern IntPtr SetClipboardViewer(IntPtr hwnd);
[System.Runtime.InteropServices.DllImport("user32")]
private static extern IntPtr ChangeClipboardChain(IntPtr hwnd, IntPtr hWndNext);
[System.Runtime.InteropServices.DllImport("user32")]
private static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);
const int WM_DRAWCLIPBOARD = 0x308;
const int WM_CHANGECBCHAIN = 0x30D;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//获得观察链中下一个窗口句柄
NextClipHwnd = SetClipboardViewer(this.Handle);
}
protected override void WndProc(ref System.Windows.Forms.Message m)
{
switch (m.Msg)
{
case WM_DRAWCLIPBOARD:
//将WM_DRAWCLIPBOARD消息传递到下一个观察链中的窗口
SendMessage(NextClipHwnd, m.Msg, m.WParam, m.LParam);
IDataObject iData = Clipboard.GetDataObject();
//检测文本
if (iData.GetDataPresent(DataFormats.Text) | iData.GetDataPresent(DataFormats.OemText))
{
this.richTextBox1.Text = (String)iData.GetData(DataFormats.Text);
}
//检测图像
if (iData.GetDataPresent(DataFormats.Bitmap))
{
pictureBox1.Image = Clipboard.GetImage();
MyItem item = new MyItem();
item.CopyToClipboard();
}
//检测自定义类型
if (iData.GetDataPresent(typeof(MyItem).FullName))
{
// MyItem item = (MyItem)iData.GetData(typeof(MyItem).FullName);
MyItem item = GetFromClipboard();
if (item != null)
{
this.richTextBox1.Text = item.ItemName;
}
}
break;
default:
base.WndProc(ref m);
break;
}
}
private void Form1_Closed(object sender, System.EventArgs e)
{
//从观察链中删除本观察窗口(第一个参数:将要删除的窗口的句柄;
//第二个参数:观察链中下一个窗口的句柄 )
ChangeClipboardChain(this.Handle, NextClipHwnd);
//将变动消息WM_CHANGECBCHAIN消息传递到下一个观察链中的窗口
SendMessage(NextClipHwnd, WM_CHANGECBCHAIN, this.Handle, NextClipHwnd);
}
IntPtr NextClipHwnd;
protected static MyItem GetFromClipboard()
{
MyItem item = null;
IDataObject dataObj = Clipboard.GetDataObject();
string format = typeof(MyItem).FullName;
if (dataObj.GetDataPresent(format))
{
item = dataObj.GetData(format) as MyItem;
}
return item;
}
}
[Serializable]
public class MyItem
{
public MyItem()
{
itemName = "This is a Custom Item";
}
public string ItemName
{
get { return itemName; }
}
private string itemName;

public void CopyToClipboard()
{
DataFormats.Format format = DataFormats.GetFormat(typeof(MyItem).FullName);
IDataObject dataObj = new DataObject();
dataObj.SetData(format.Name, false, this);
Clipboard.SetDataObject(dataObj, false);
}
}
}

希望本文所述对大家的C#程序设计有所帮助。

相关文章

  • 使用C#实现读取PDF中所有文本内容

    使用C#实现读取PDF中所有文本内容

    这篇文章主要为大家详细介绍了如何使用C#实现读取PDF中所有文本内容,文中的示例代码简洁易懂,具有一定的学习价值,有需要的小伙伴可以了解下
    2024-02-02
  • C#版的 Escape() 和 Unescape() 函数分享

    C#版的 Escape() 和 Unescape() 函数分享

    从网上看到两个方法, C# 版的 Escape() 和 Unescape(),收藏下。
    2011-05-05
  • Unity Shader实现翻书效果

    Unity Shader实现翻书效果

    这篇文章主要为大家详细介绍了Unity Shader实现翻书效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • 深入c# Func委托的详解

    深入c# Func委托的详解

    本篇文章是对c#中的Func委托进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • C# 拼图魔方小游戏

    C# 拼图魔方小游戏

    这篇文章主要介绍了C# 拼图魔方小游戏,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • C#遍历文件夹及其子目录的完整实现方法

    C#遍历文件夹及其子目录的完整实现方法

    这篇文章主要介绍了C#遍历文件夹及其子目录的方法,涉及C#文件与目录的基本操作技巧,简单实用,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • C# datagridview、datagrid、GridControl增加行号代码解析

    C# datagridview、datagrid、GridControl增加行号代码解析

    今天这篇文章小编就来给大家分享关于C# datagridview、datagrid、GridControl增加行号的介绍,主要包括WinForm中datagridview增加行号、WPF中datagrid增加行号、WPF dev控件GridControl增加行号三个内容,感兴趣等我小伙伴可以参考一下
    2021-10-10
  • C#读取Excel到DataTable的方法示例

    C#读取Excel到DataTable的方法示例

    这篇文章主要介绍了C#读取Excel到DataTable的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-04-04
  • C#多线程系列之线程完成数

    C#多线程系列之线程完成数

    本文详细讲解了C#多线程中的线程完成数,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • 详解C#中的委托

    详解C#中的委托

    本文主要介绍了C#中委托的相关知识。具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01

最新评论