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

标签:C#,剪贴板,Clipboard,类
0
投稿

猜你喜欢

  • SpringBoot+LayIM+t-io 实现好友申请通知流程

    2023-07-13 11:41:52
  • Java Stax解析XML示例

    2022-04-07 13:42:15
  • 使用设计模式中的工厂方法模式进行C#编程的示例讲解

    2023-10-21 05:27:08
  • Java 注解学习笔记

    2022-12-25 02:40:54
  • MyBatis中的模糊查询语句

    2022-09-30 03:36:59
  • C#异步调用实例小结

    2023-07-16 10:31:03
  • 分享一个Android设置圆形图片的特别方法

    2022-06-27 23:17:27
  • spring mvc url匹配禁用后缀访问操作

    2021-11-19 23:57:34
  • JDK8中的HashMap初始化和扩容机制详解

    2023-11-25 10:06:44
  • C# Winform 分页功能的实现

    2023-03-29 06:07:10
  • C++ 先对数组排序,在进行折半查找

    2021-07-07 09:03:18
  • Java 通过API操作GraphQL

    2021-12-24 03:21:49
  • Android横竖屏切换实例总结

    2022-06-26 20:48:04
  • Java中ArrayList初始化的四种方法详解

    2022-03-29 21:50:13
  • java导出生成word的简单方法

    2023-11-23 23:07:13
  • Junit测试多线程无法得到结果的问题解决

    2023-01-01 22:12:52
  • C#生成MD5的函数代码

    2021-08-04 14:50:24
  • JavaMail入门教程之发送邮件(3)

    2023-02-01 20:01:16
  • 在C#中使用OpenCV(使用OpenCVSharp)的实现

    2023-02-21 16:15:38
  • Android Button按钮的四种点击事件

    2021-12-16 04:02:41
  • asp之家 软件编程 m.aspxhome.com