C#操作Clipboard读取剪切板中数据实例详解
本文实例讲述了C#操作Clipboard读取剪切板中数据的方法。分享给大家供大家参考。具体分析如下:
1自定义一个类,并且保证它的可序列化的:实现ISerializable接口;或者用[Serializable]标记(如果有父类,则父类也需要被标记;可以[NonSerialized()]标记类中不想被序列化的字段)
2注册自定义数据格式:调用静态方法DataFormats.GetFormat()
3保存数据到clipboard:利用IdataObject接口,创建一个数据对象,并设置数据;调用Clipboard.SetDataObject()方法
4从clipboard获取数据:调用DataObject实例的GetDataPresent()保证数据格式与应用程序兼容;调用IDataObject的GetData()方法获取数据
示例程序:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.Runtime.Serialization.Formatters.Binary;
namespace_ClipboardTest_
{
publicpartialclassForm1:Form
{
[System.Runtime.InteropServices.DllImport("user32")]
privatestaticexternIntPtrSetClipboardViewer(IntPtrhwnd);
[System.Runtime.InteropServices.DllImport("user32")]
privatestaticexternIntPtrChangeClipboardChain(IntPtrhwnd,IntPtrhWndNext);
[System.Runtime.InteropServices.DllImport("user32")]
privatestaticexternintSendMessage(IntPtrhwnd,intwMsg,IntPtrwParam,IntPtrlParam);
constintWM_DRAWCLIPBOARD=0x308;
constintWM_CHANGECBCHAIN=0x30D;
publicForm1()
{
InitializeComponent();
}
privatevoidForm1_Load(objectsender,EventArgse)
{
//获得观察链中下一个窗口句柄
NextClipHwnd=SetClipboardViewer(this.Handle);
}
protectedoverridevoidWndProc(refSystem.Windows.Forms.Messagem)
{
switch(m.Msg)
{
caseWM_DRAWCLIPBOARD:
//将WM_DRAWCLIPBOARD消息传递到下一个观察链中的窗口
SendMessage(NextClipHwnd,m.Msg,m.WParam,m.LParam);
IDataObjectiData=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();
MyItemitem=newMyItem();
item.CopyToClipboard();
}
//检测自定义类型
if(iData.GetDataPresent(typeof(MyItem).FullName))
{
//MyItemitem=(MyItem)iData.GetData(typeof(MyItem).FullName);
MyItemitem=GetFromClipboard();
if(item!=null)
{
this.richTextBox1.Text=item.ItemName;
}
}
break;
default:
base.WndProc(refm);
break;
}
}
privatevoidForm1_Closed(objectsender,System.EventArgse)
{
//从观察链中删除本观察窗口(第一个参数:将要删除的窗口的句柄;
//第二个参数:观察链中下一个窗口的句柄)
ChangeClipboardChain(this.Handle,NextClipHwnd);
//将变动消息WM_CHANGECBCHAIN消息传递到下一个观察链中的窗口
SendMessage(NextClipHwnd,WM_CHANGECBCHAIN,this.Handle,NextClipHwnd);
}
IntPtrNextClipHwnd;
protectedstaticMyItemGetFromClipboard()
{
MyItemitem=null;
IDataObjectdataObj=Clipboard.GetDataObject();
stringformat=typeof(MyItem).FullName;
if(dataObj.GetDataPresent(format))
{
item=dataObj.GetData(format)asMyItem;
}
returnitem;
}
}
[Serializable]
publicclassMyItem
{
publicMyItem()
{
itemName="ThisisaCustomItem";
}
publicstringItemName
{
get{returnitemName;}
}
privatestringitemName;
publicvoidCopyToClipboard()
{
DataFormats.Formatformat=DataFormats.GetFormat(typeof(MyItem).FullName);
IDataObjectdataObj=newDataObject();
dataObj.SetData(format.Name,false,this);
Clipboard.SetDataObject(dataObj,false);
}
}
}
希望本文所述对大家的C#程序设计有所帮助。