C#使用Clipboard类实现剪贴板功能
作者:springsnow 发布时间:2022-09-29 06:03:54
剪贴板是Windows操作系统中最常用的功能之一,它用来从一个应用程序向另一个应用程序传递数据,可以是文本,图象,甚至是程序对象。
不过剪贴板也有限制,它在某个特定的时间只能指向一块内容,每一个随后复制的内容都会取代先前的内容。
为了在C#中操作剪贴板(包括内容的读取和写入)需要使用到System.Windows.Forms.Clipboard类
一、向剪贴板中存放东西。相当于Ctrl+C
主要用到Clipboard类的SetDataObject(Object obj,bool copy )方法,此方法是将目标对象放入剪贴板中。
obj就是目标对象,
参数copy表示是否在程序结束时仍然保存对象于剪贴板。如果设置为false,或者不设置,将在程序运行结束后不保留剪切板内容。
1、存放普通数据
Clipboard.SetDataObject(textBox1.Text);
通过以上代码便完成了复制操作。你可以打开文本文档,按下Ctrl+V 看一下效果。
2、往剪切板里存取自定义数据
C#的对象的数据结构并不能为剪切板所理解,所以你要把你自定义的数据放到剪切板去的话要把它序列化,在实际操作中,是要你提供一个“可序列化”的对象。
注意:
对象必须是可序列化的(Serializable注解),才能将其放在剪贴板上。 如果将非序列化对象传递到剪贴板方法,则该方法将失败,且不会引发异常。
Clipboard 类只能在设置为单线程单元(STA)模式的线程中使用。 若要使用此类,请确保
Main
方法使用 STAThreadAttribute 属性进行标记。如果数据比较复杂,可以考虑把数据自行序列化到一个Stream对象去,再把Stream对象写入剪切板,获取的时候对Stream对象自行反序列化,还原数据。
下面是个简单的例子:
[Serializable]
public class User {
public int age { get; set; }
public string name { get; set; }
}
class Program {
[STAThread]
static void Main(string[] args) {
User userIn = new User();
userIn.name = "Jack";
userIn.age = 18;
Clipboard.SetData("mydata", userIn);
User userOut = (User)Clipboard.GetData("mydata");
Console.WriteLine(userOut.name +" | " + userOut.age);
}
}
最后要注意的一点是由于这里的数据类型是“mydata”,你也可以指定别的名字,这种类型数据只有你自己的程序能读懂,也就是说,你是不能打开记事本或者Photoshop,直接把你这个User对象贴上去的。
二、从剪贴板读取东西。相当于Ctrl+V
主要用到的方法为:GetDataObject()用来检索剪贴板中的数据,它返回的是任何格式的数据,返回IDataObject接口,用来接收任何数据。
IDataObject接口实例的 GetDataPresent (Type Format)方法返回bool值,获取指定类型是否可用。
另外就是DataFormats类,该类主要是用来标识格式用的。
从剪切板上获得数据不影响剪贴板的内容,GetData的返回值是存储在剪贴板上的副本。
1、粘贴文本的方法:
IDataObject iData = Clipboard.GetDataObject();
if (iData.GetDataPresent(DataFormats.Text))
{
//如果剪贴板中的数据是文本格式
this.label1.Text = (string)iData.GetData(DataFormats.Text);//检索与指定格式相关联的数据
}
else
{
MessageBox.Show("目前剪贴板中数据不可转换为文本", "错误");
}
2、粘贴图片:
if (Clipboard.ContainsImage())
{
Image img = Clipboard.GetImage();
pictureBox1.Image = img;
}
或者
IDataObject iData = Clipboard.GetDataObject();
if (iData.GetDataPresent(DataFormats.Bitmap))
{
this.pictureBox1.Image = (Bitmap)iData.GetData(DataFormats.Bitmap);
}
else
{
MessageBox.Show("目前剪贴板中数据不可转换为图片", "错误");
}
3、控件自带的paste方法
另外我们可以利用某些控件自带的paste方法进行粘贴操作,我们这里以richtextbox为例。[注:在使用控件的paste方法之前必须确保控件的readonly属性为false,否则无法对控件进行此操作!]
现在我们就用paste方法来实现向richtextbox中加入图片。
OpenFileDialog fd = new OpenFileDialog();
fd.Filter = "图片文件|*.jpg|所有文件|*.*";
if (fd.ShowDialog() == DialogResult.OK)
{
Clipboard.SetDataObject(Image.FromFile(fd.FileName), true);
DataFormats.Format myFormat = DataFormats.GetFormat(DataFormats.Bitmap);
richTextBox2.ReadOnly = false;
if (richTextBox2.CanPaste(myFormat))//判断此控件是否可以粘贴这个格式的数据
{
richTextBox2.Paste(myFormat);
}
else
{
MessageBox.Show("无法粘贴!");
}
}
来源:https://www.cnblogs.com/springsnow/p/13282029.html


猜你喜欢
- Android开发中的图片存储本来就是比较耗时耗地的事情,而使用第三方的七牛云,便可以很好的解决这些后顾之忧,最近我也是在学习七牛的SDK,
- Sequence序列Sequence 是Kotlin标准库提供的一种容器类型。它和Iterable一样具备对集合进行多步骤操作能力,但是却是
- 引言在实际分布式项目中延迟任务一般不会使用JDK自带的延迟队列,因为它是基于JVM内存存储,没有持久化操作,所以当服务重启后就会丢失任务。在
- JDK集合源码之HashMap解析1.树结构入门1.1 什么是树?树(tree)是一种抽象数据类型(ADT),用来模拟具有树状结构性质的数据
- 本文实例为大家分享了Unity实现截图功能的具体代码,供大家参考,具体内容如下一、使用Unity自带APIusing UnityEngine
- 本系列文章会根据项目的进度进行相关介绍,其会分为多个模块,每个模块互不依赖,各个模块都是单独的学习内容,如sqlite学习模块,contac
- 在WPF里用MediaElement控件,实现一个循环播放单一视频的程序,同时可以控制视频的播放、暂停、停止。一种方式,使用MediaEle
- 目录配置创建OkHttpClient同步get请求异步get请求同步post请求异步post请求上传文件表单提交下面是官网给出的OKHTTP
- 1、Service层:业务层–>控制业务业务模块的逻辑功能设计,和DAO层一样都是先设计接口,再创建要实现的类,然
- 一、文件存储特点:openFileInput()和openFileOutput()读取设备上的文件。优点:适用于存储大量的数据,可以存储图片
- 新手当在一个类文件中进行了一些操作之后,会造成sout快捷命令无法自动生成。比如操作了import引入其它包之后。主要是对IDEA操作的不熟
- 本文实例为大家分享了Android SurfaceView画板操作的具体代码,供大家参考,具体内容如下画板—&m
- 上篇随笔详细介绍了三种解析服务器端传过来的xml数据格式,而对于服务器端来说,返回给客户端的数据格式一般分为html、xml和json这三种
- 一,准备沙箱环境1,登录支付宝,进入 应用列表界面 https://openhome.alipay.com/dev/workspace2,如
- 前言支付宝推出一个沙箱环境,能够很好的模拟支付宝支付,并且还提供了demo,但demo是一个普通web项目,怎么整合到Spring Boot
- 前言C# 的编译器可以对代码进行优化,所以,我们在写代码的时候,可以更多地考虑一下代码的易读性问题。不考虑基本的对齐和换行美化。看一下局部变
- 一、前言无论承接什么样的需求,是不是身边总有那么几个人代码写的烂,但是却时常有测试小姐姐过来聊天(求改bug)、有产品小伙伴送吃的(求写需求
- 斗地主规则:1. 组装54张扑克牌2. 将54张牌顺序打乱3. 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌。4. 查看三
- Java多线程综合案例数字加减设计4个线程对象,两个线程执行减操作,两个线程执行加操作public class ThreadDemo{ &n
- 功能:解决web站点的登录,权限验证,授权等功能优点:在不影响站点业务代码,可以权限的授权与验证横切到业务中1、要添加的依赖<!--t