C#读取剪切板(Clipboard)中的数据的方法
2013-02-05 16:11
429 查看
1 自定义一个类,并且保证它的可序列化的:实现ISerializable接口;或者用[Serializable]标记(如果有父类,则父类也需要被标记;可以[NonSerialized()]标记类中不想被序列化的字段)
2 注册自定义数据格式:调用静态方法DataFormats.GetFormat()
3 保存数据到clipboard:利用IdataObject接口,创建一个数据对象,并设置数据;调用Clipboard.SetDataObject()方法
4 从clipboard获取数据:调用DataObject 实例的GetDataPresent()保证数据格式与应用程序兼容;调用IDataObject 的GetData()方法获取数据
示例程序:
2 注册自定义数据格式:调用静态方法DataFormats.GetFormat()
3 保存数据到clipboard:利用IdataObject接口,创建一个数据对象,并设置数据;调用Clipboard.SetDataObject()方法
4 从clipboard获取数据:调用DataObject 实例的GetDataPresent()保证数据格式与应用程序兼容;调用IDataObject 的GetData()方法获取数据
示例程序:
public partial class Form1 : Form { #region 获取剪切板内容 IntPtr NextClipHwnd; [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; #endregion 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.TextBox3.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.TextBox3.Text = item.ItemName; } } break; default: base.WndProc(ref m); break; } } private void Form1_FormClosed(object sender, FormClosedEventArgs e) { //从观察链中删除本观察窗口(第一个参数:将要删除的窗口的句柄;第二个参数:观察链中下一个窗口的句柄 ) ChangeClipboardChain(this.Handle, NextClipHwnd); //将变动消息WM_CHANGECBCHAIN消息传递到下一个观察链中的窗口 SendMessage(NextClipHwnd, WM_CHANGECBCHAIN, this.Handle, 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#读取剪切板(Clipboard)中的数据的方法
- C#读取剪切板(Clipboard)中的数据的方法
- C#操作Clipboard读取剪切板中数据实例详解
- C#读取ini文件数据的方法和后台服务的相关知识
- c# 解决读取Excel混合文本类型,数据读取失败的解决方法
- [导入]c# 统计方法执行时间,计算缓存读取数据方法的命中率
- c# 统计方法执行时间,计算缓存读取数据方法的命中率
- 对c#剪切板Clipboard占用的问题一点解决方法
- c# 读取excel数据的两种方法
- c#频繁读取word文件 所请求的剪切板操作失败 解决方法
- c# 读取excel数据的三种方法
- c#读取通达信历史数据的方法
- 用C#编程从数据库中读取图片数据导进Excel文件的方法(如何从数据库中读取保存的文件,直接打开,中间不保存到本地)
- C# 连接SQL Server 数据库的 读取数据的基本原理方法
- C# 读取XML中的数据信息内容的方法
- 用C#编程从数据库中读取图片数据导进Excel文件的方法
- C#从数据库读取数据到DataSet并保存到xml文件的方法
- 比较C#三种方法实现读取Execl数据到数据库
- c# 解决读取Excel混合文本类型,数据读取失败的解决方法
- C#.NET示例读写xml所有节点的代码实现方法和读取xml节点的数据总结