欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#操作Clipboard读取剪切板中数据实例详解

程序员文章站 2023-08-22 22:07:33
本文实例讲述了c#操作clipboard读取剪切板中数据的方法。分享给大家供大家参考。具体分析如下: 1 自定义一个类,并且保证它的可序列化的:实现iserializab...

本文实例讲述了c#操作clipboard读取剪切板中数据的方法。分享给大家供大家参考。具体分析如下:

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

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

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

4 从clipboard获取数据:调用dataobject 实例的getdatapresent()保证数据格式与应用程序兼容;调用idataobject 的getdata()方法获取数据

示例程序:

using system;
using system.collections.generic;
using system.componentmodel;
using system.data;
using system.drawing;
using system.linq;
using system.text;
using system.windows.forms;
using system.runtime.serialization.formatters.binary;
namespace _clipboardtest_
{
public partial class form1 : form
{
[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;
public form1()
{
initializecomponent();
}
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.richtextbox1.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.richtextbox1.text = item.itemname;
}
}
break;
default:
base.wndproc(ref m);
break;
}
}
private void form1_closed(object sender, system.eventargs e)
{
//从观察链中删除本观察窗口(第一个参数:将要删除的窗口的句柄;
//第二个参数:观察链中下一个窗口的句柄 )
changeclipboardchain(this.handle, nextcliphwnd);
//将变动消息wm_changecbchain消息传递到下一个观察链中的窗口
sendmessage(nextcliphwnd, wm_changecbchain, this.handle, nextcliphwnd);
}
intptr 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#程序设计有所帮助。