总结:VC#中从Clipboard保存获取数据的方法

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

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

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

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

示例程序:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Runtime.Serialization.Formatters.Binary;
  10. namespace _ClipboardTest_
  11. {
  12.     public partial class Form1 : Form
  13.     {
  14.         [System.Runtime.InteropServices.DllImport("user32")]
  15.         private static extern IntPtr SetClipboardViewer(IntPtr hwnd);
  16.         [System.Runtime.InteropServices.DllImport("user32")]
  17.         private static extern IntPtr ChangeClipboardChain(IntPtr hwnd, IntPtr hWndNext);
  18.         [System.Runtime.InteropServices.DllImport("user32")]
  19.         private static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);
  20.         const int WM_DRAWCLIPBOARD = 0x308;
  21.         const int WM_CHANGECBCHAIN = 0x30D;
  22.         public Form1()
  23.         {
  24.             InitializeComponent();
  25.         }       
  26.         private void Form1_Load(object sender, EventArgs e)
  27.         {
  28.             //获得观察链中下一个窗口句柄
  29.             NextClipHwnd = SetClipboardViewer(this.Handle); 
  30.         }
  31.         protected override void WndProc(ref System.Windows.Forms.Message m)
  32.         {
  33.             switch (m.Msg)
  34.             {
  35.                 case WM_DRAWCLIPBOARD:
  36.                     //将WM_DRAWCLIPBOARD消息传递到下一个观察链中的窗口
  37.                     SendMessage(NextClipHwnd, m.Msg, m.WParam, m.LParam);
  38.                     IDataObject iData = Clipboard.GetDataObject();
  39.                     //检测文本
  40.                     if (iData.GetDataPresent(DataFormats.Text) | iData.GetDataPresent(DataFormats.OemText))
  41.                     {
  42.                         this.richTextBox1.Text = (String)iData.GetData(DataFormats.Text);
  43.                     }
  44.                     //检测图像
  45.                     if (iData.GetDataPresent(DataFormats.Bitmap))
  46.                     {
  47.                         pictureBox1.Image = Clipboard.GetImage();
  48.                         MyItem item = new MyItem();
  49.                         item.CopyToClipboard();
  50.                     }
  51.                     //检测自定义类型
  52.                     if (iData.GetDataPresent(typeof(MyItem).FullName))
  53.                     {
  54.                        // MyItem item = (MyItem)iData.GetData(typeof(MyItem).FullName);
  55.                         MyItem item = GetFromClipboard();
  56.                         if (item != null)
  57.                         {
  58.                             this.richTextBox1.Text = item.ItemName;
  59.                         }
  60.                     }
  61.                     break;
  62.                 default:
  63.                     base.WndProc(ref m);
  64.                     break;
  65.             }
  66.         }
  67.         private void Form1_Closed(object sender, System.EventArgs e)
  68.         {
  69.             //从观察链中删除本观察窗口(第一个参数:将要删除的窗口的句柄;第二个参数:观察链中下一个窗口的句柄 )
  70.             ChangeClipboardChain(this.Handle, NextClipHwnd);
  71.             //将变动消息WM_CHANGECBCHAIN消息传递到下一个观察链中的窗口 
  72.             SendMessage(NextClipHwnd, WM_CHANGECBCHAIN, this.Handle, NextClipHwnd);
  73.         }
  74.         IntPtr NextClipHwnd;
  75.         protected static MyItem GetFromClipboard()
  76.         {
  77.             MyItem item = null;
  78.             IDataObject dataObj = Clipboard.GetDataObject();
  79.             string format = typeof(MyItem).FullName;
  80.             if (dataObj.GetDataPresent(format))
  81.             {
  82.                 item = dataObj.GetData(format) as MyItem;
  83.             }
  84.             return item;
  85.         }
  86.     }
  87.     [Serializable]
  88.     public class MyItem
  89.     {
  90.         public MyItem()
  91.         {
  92.             itemName = "This is a Custom Item";
  93.         }
  94.         public string ItemName
  95.         {
  96.             get { return itemName; }
  97.         }
  98.         private string itemName;
  99.         public void CopyToClipboard()
  100.         {
  101.             DataFormats.Format format = DataFormats.GetFormat(typeof(MyItem).FullName);
  102.             IDataObject dataObj = new DataObject();
  103.             dataObj.SetData(format.Name, falsethis);
  104.             Clipboard.SetDataObject(dataObj, false);
  105.         }        
  106.     }
  107. }

参考资料:

http://www.codeproject.com/KB/cs/copycustomclasstoclipbrd.aspx

http://blog.csdn.net/waxic/archive/2006/10/08/1326234.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值