当前位置: 移动技术网 > IT编程>开发语言>c# > C#操作Clipboard读取剪切板中数据实例详解

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

2019年07月18日  | 移动技术网IT编程  | 我要评论
本文实例讲述了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#程序设计有所帮助。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网