C#操作Clipboard读取剪切板中数据实例详解
程序员文章站
2022-06-03 18:26:20
本文实例讲述了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#程序设计有所帮助。
上一篇: 安装Redis(Windows版)
下一篇: C#多线程中的异常处理操作示例