原文地址 https://www.cnblogs.com/younShieh/p/17010572.html

如果本文对你有所帮助,不妨点个关注和推荐呀,这是对笔者最大的支持~





  我们先考虑一般会从什么地方复制文本、图片到我们的软件中。

  首先说文本。我们可能会从文本文件,网页,word,ppt,qq,微信,甚至是vsCode等等地方进行复制。能进行文本复制的地方千奇百怪,但是他们使用的都是通用文本容器控件(TextBlock、TextBox等),这些控件的底层复制操作都是一样的,都是将字符串放置到剪切板中。我们只需要获取剪切板中的数据就可以获取到想要的文本数据。当然,如果需要获取特殊样式的文本,比如加粗效果、斜体等效果的文字,还需要特殊处理。

  注意,如果复制PPT元素时,只是框选中了文字进行复制的话,是可以进行文字粘贴的。但是如果复制的是PPT整个文本框元素,就不行。PPT会提前把这个元素转换为对应图片保存到剪切板中。你想去获取文本时,文本为空,这个元素只能转换为图片,甚至默认还有白色背景。。。如果能对PPT进行元素级的解析,则可以转换为文字。WPS同理。

  其次是图片。能进行图片复制的地方就没那么多了,我们主要考虑常见的地方,比如电脑本机,网页,ppt,qq,微信等。不同的地方复制的图片在剪切板中的存储方式也可能不同,这就需要不同的处理方式。大致可以区分为源文本复制和位图数据复制。

  1. 获取剪切板对象
IDataObject dataObject = Clipboard.GetDataObject();

  1. 分析剪切板数据

  通过GetFormats()方法获取复制元素的类型。

string[] formats = dataObject.GetFormats();

  formats数组中可以看到现在复制的是什么类型的元素,方便调试。




  解析为纯文字。

var str = dataObject.GetData(DataFormats.Text);

  复制项不为文字的话,str=null。


  本地文件、qq和微信(部分)中的图片复制时,为源文件复制。

if (dataObject.GetFormats().Contains(DataFormats.FileDrop)
&& dataObject.TryGetData(DataFormats.FileDrop) is string[] array
&& array.Any())
{
//array为文件路径
}

ppt、word、excel、微信(部分)、网页中的图片都保存为了位图数据,需要按照不同的数据结构进行解析。

可以先创建一个保存的目录,把转换出来的图片保存为本地文件再插入。图片可能会有透明图层,最好转换为png格式。代码如下:

string fullName = Path.Combine(AppPath.Temp, Guid.NewGuid().ToString() + ".png");
string[] formats = dataObject.GetFormats();
if (formats.Contains(DataFormats.Dib))
{
if (dataObject.GetData(DataFormats.Bitmap) is Bitmap bitmap)
{
bitmap.Save(fullName, ImageFormat.Png);
}
} if (!File.Exists(fullName))
{
if (System.Windows.Clipboard.GetData(DataFormats.Bitmap) is InteropBitmap interopBitmap) //复制ppt中透明图层的图片
{
interopBitmap.ToLocalImage(fullName);
}
else
{
if (System.Windows.Forms.Clipboard.GetImage() is Image image)
{
((Bitmap)image).ToLocalImage(fullName, ImageFormat.Png);
}
}
}
if (File.Exists(fullName))
{
//插入到软件
}



或许我们还需要在软件内部对某个特殊元素进行复制粘贴。只需要在复制时带上你的特殊元素类型。

IDataObject dataObject = Clipboard.GetDataObject();
dataObject.SetData(typeof(SpacialElement), _element);
Clipboard.SetDataObject(dataObject, true);

在粘贴时,检查是否存在改类型,或者强制转换为相应类型。

if(dataObject.GetData(typeof(SpacialElement) is SpacialElement element)
{
}

最新文章

  1. ubuntu 12.04 LTS 如何使用更快的更新源
  2. jquery选项卡
  3. ELK+redis搭建nginx日志分析平台
  4. ubuntu13.04环境hadoop1.2.1单机模式安装
  5. NuGet在创建pack时提示”The replacement token 'author' has no value“问题解决
  6. Intellij IDEA连接Git@OSC
  7. 3.openssl speed和openssl rand
  8. 转:strcmp函数实现及分析
  9. MVC 错误处理1
  10. 手机扫描二维码下载APP,根据操作系统不同自动下载
  11. 全栈工程师带你开发 ,node开发人脸识别门禁系统
  12. 小dai浅谈通信网络(一)——引子
  13. Image和Base64互相转换
  14. LOJ2276 [HAOI2017] 新型城市化 【二分图匹配】【tarjan】
  15. 【CF1132G】Greedy Subsequences(线段树)
  16. PyCharm使用秘籍
  17. html+jquery实现简单图片裁剪
  18. C#如何调用以管理员身份运行的cmd命令提示符
  19. c#所有部门及其下所部门生成树形图(递归算法获取或键值对方式获取)
  20. 转载:Unicode和Utf-8有何区别 转载自知乎 原文作者不详

热门文章

  1. 巧用VBA实现:基于多个关键词模糊匹配Excel多行数据
  2. IDEA对数据库、表、记录的(增删改查可视化操作)、数据库安全性问题的演示
  3. resultMap处理字段和属性的映射关系
  4. 【听如子说】-python模块系列-AIS编解码Pyais
  5. 9-模型层及ORM介绍
  6. nrf9160做主控连接阿里云——(mqtt_simple例程)
  7. Istio(九):istio安全之授权
  8. Debian安装 WineHQ 安装包
  9. uniapp/微信小程序 项目day03
  10. JAVA代码审计之xss