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