剪切板是Windows系统提供的功能,从我最早接触到的Windows 3.2版本开始,就一直带着了。以前使用C++的时候,是直接使用Windows API对其进行操作的,到了.NET下,在WinForm中也有一个对剪切板的封装类,即System.Windows.Forms.Clipboard,这个类其实是通过COM组件间接地使用剪切板的,我个人觉得COM是一个设计非常糟糕的东西,难懂坑多还不可移植,但微软现存的大量代码又是基于COM的,所以又无法彻底舍弃,关于不可移植这个并不难理解,前面说了,剪切板是Windows提供的功能,你在Linux下,或者在MacOS下,尽管有类似的功能,但跟Windows的肯定不同,所以最新的.NET Core中是不能使用剪切板功能的。

往剪切板里存取字符串

字符串是最最常用的数据对象了,我们就往剪切板里写一个字符串吧,我总结了一下,见下表:

方法1 Clipboard.SetText(str);  很可能有问题
方法2 Clipboard.SetData(DataFormats.Text,str);  很可能有问题
方法3 Clipboard.SetDataObject(str);  大多数时候没问题

嗯?怎么这么不确定?确实如此,这是我进行了大量试验的结果,且程序在调试和非调试中还有不同的表现,可能出现的异常有以下两个:

(异常1:COMException)

(异常2:ExternalException)

两个异常都没有进一步的提示信息,异常的原因很类似,就是剪切板访问不了,而我使用方法3的时候,在非调试状态下还没发现过什么问题。我实在找不到进一步的规律了,先这样用吧。

那么如何从剪切板获取字符串呢?对应的,有两种方法:

方法1 string str = (string)Clipboard.GetData(DataFormats.Text) 很可能有问题
方法2 string str = Clipboard.GetText(); 大多数时候没问题

具体原因我同样不太清楚,这似乎是微软留下的一个bug,SO上有个讨论,可以去看看:StackOverflow

另外还有两点需要注意:

  1. 方法3这种往剪切板里写文本内容的方式,在这个程序结束之后,剪切板内容将会失效,要使得程序结束后剪切板内容继续有效的话,得使用Clipboard.SetDataObject(str, true);这个方法,第二个参数true表示让剪切板内容在程序结束后继续有效,但我发现加上这个参数之后,增加了出现异常的可能性。
  2. 必须在给程序的入口函数(通常是Main函数)加上STAThreadAttribute这个注解,否则对剪切板的访问会报错:在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。

往剪切板里存取自定义数据

C#的对象的数据结构并不能为剪切板所理解,所以你要把你自定义的数据放到剪切板去的话要把它序列化,在实际操作中,是要你提供一个“可序列化”的对象,下面是个简单的例子:

[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 = ;
Clipboard.SetData("mydata", userIn);
User userOut = (User)Clipboard.GetData("mydata");
Console.WriteLine(userOut.name +" | " + userOut.age);
}
}

注意User这个类前面的Serializable注解,如果没有这个注解,是没法成功将对象写入剪切板的。如果数据比较复杂,可以考虑把数据自行序列化到一个Stream对象去,再把Stream对象写入剪切板,获取的时候对Stream对象自行反序列化,还原数据。例子就不写了。

最后要注意的一点是由于这里的数据类型是“mydata”,你也可以指定别的名字,这种类型数据只有你自己的程序能读懂,也就是说,你是不能打开记事本或者Photoshop,直接把你这个User对象贴上去的。

C#操作剪切板(Clipboard)的更多相关文章

  1. C# 使用WinApi操作剪切板Clipboard

    前言: 最近正好写一个程序,需要操作剪切板 功能很简单,只需要从剪切板内读取字符串,然后清空剪切板,然后再把字符串导入剪切板 我想当然的使用我最拿手的C#来完成这项工作,原因无他,因为.Net框架封装 ...

  2. Javascript操作剪切板数据(支持IE、Chrome、360、搜狗),亲测!

    clipboarddata只能在IE浏览器中使用,在chrome下会提示对象未定义!以下的方法支持IE.Chrome.360.搜狗等浏览器,其它浏览器还未验证. <!DOCTYPE html&g ...

  3. c#操作剪切板

    C#定义了一个类System.Windows.Forms.Clipboard来简化剪切板操作,这个类有一个静态方法,主要有: Clear 清除剪切板中的所有数据: ContainsData,Conta ...

  4. 对c#剪切板Clipboard占用的问题一点解决方法

    以前在百度写的文档,转移到此处 前几天做一个程序,其中有一个剪切板的操作,具体代码: Clipboard.SetText(“ABC”); 来完成一个复制字符串的操作. 自己调试通过,完全正常,然后就交 ...

  5. 在Java中调用与系统有关的剪切板Clipboard

    java从1.5版开始已经能与系统的剪切板很好的交互了. 如果可以在程序中直接调用系统的剪切板来保存“复制”的对象内容,那可以说的比之前的想法好很多. 下面是一个对java.io.File对象进行co ...

  6. VBS操作剪切板

    '设置剪切板的内容 Dim Form, TextBox Set Form = CreateObject("Forms.Form.1") Set TextBox = Form.Con ...

  7. python 操作剪切板

    python3 在使用网上找到的一些使用剪切板的片段时发现存在写入剪切板后乱码的情况, 研究后发现python3不能使用SetClipboardData方法, 要使用SetClipboardText ...

  8. 【转载】VC操作剪切板

    1.在剪切板上放置数据 if(OpenClipboard())    //打开剪切板{    EmptyClipboard(); //清空剪切板    CString str;       //从控件 ...

  9. 使用ZeroClipboard操作剪切板

    一.ZeroClipboard下载地址 点击下载 二.添加js引用 <script src="../Assets/js/jquery-1.8.3.min.js">< ...

随机推荐

  1. React从入门到放弃之前奏(2):React简介

    本系列将尽可能使用ES6(ES2015)语法.所以均在上节webpack的基础上做开发. React是Facebook开发的一款JS库,因为基于Virtual DOM,所以响应速度快,以及支持跨平台. ...

  2. 《javascript语言精粹》读书笔记 Item2 对象

    第三章 对象 JavaScript的简单数据类型包括数字.字符串.布尔值(true和false).null值和undefined值.其他 数字.字符串和布尔值"貌似"对象,因为它们 ...

  3. python之@property

    在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改: s = Student() s.score = 9999 这显然不合逻辑.为了限制score的 ...

  4. guid.go

    ] = byte(g)     hex.Encode(h[:], b[:])     return h }

  5. POJ1038 Bugs Integrated, Inc 状压DP+优化

    (1) 最简单的4^10*N的枚举(理论上20%) (2) 优化优化200^3*N的枚举(理论上至少50%) (3) Dfs优化状压dp O(我不知道,反正过不了,需要再优化)(理论上80%) (4) ...

  6. linux目录详细介绍

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://yangrong.blog.51cto.com/6945369/1288072 目 ...

  7. Java 使用PDFBox提取PDF文件中的图片

    今天做PDF文件解析,遇到一个需求:提取文件中的图片并保存.使用的是流行的apache开源jar包pdfbox, 但还是遇到坑了,比如pdfbox版本太高或太低都不能用!!这个包竟然没有很好地做好兼容 ...

  8. H5移动端项目案例、web手机微商城实战开发

    自微信生态圈一步步强大后,关于移动端购物的趋势,逐渐成为大众关心的内容,目前市场上关于移动商城的制定就有大量版本,比如.微商城.移动商城.移动webAPP.微信商城各等各种定义层出不穷,这就对于移动端 ...

  9. 第十四章——循环神经网络(Recurrent Neural Networks)(第二部分)

    本章共两部分,这是第二部分: 第十四章--循环神经网络(Recurrent Neural Networks)(第一部分) 第十四章--循环神经网络(Recurrent Neural Networks) ...

  10. 新手教程:不写JS,在MIP页中实现异步加载数据

    从需求谈起:在 MIP 页中异步加载数据 MIP(移动网页加速器) 的 加速原理 除了靠谱的 MIP-Cache CDN 加速外,最值得一提的就是组件系统.所有 JS 交互都需要使用 MIP 组件实现 ...