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#程序设计有所帮助。