原文地址 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)
{
}

【c#】从外部复制文本、图片到我的软件中的解决方案(支持ppt,qq等)的更多相关文章

  1. 对于pycharm和vscode下,从外部复制文本内容为python字符串内容是会自动加\u202a解决办法

    先来看下这个python3源代码,表面上看没有语法毛病,如果源代码字符串内容是手动复制过来的文本内容,在pycharm和vscode下始终提示: pywintypes.error: (2, 'Shel ...

  2. js实现点击按钮复制文本功能

    最近项目活动中用到复制文本功能,发现在chrome中之前的clipboard的demo失效了,查了下发现是因为版本升级导致的.最新用法如下: <!DOCTYPE html> <htm ...

  3. ZeroClipboard – 轻松实现复制文本到剪贴板功能

    ZeroClipboard 库提供了一种把文本复制到剪贴板的简单方法.Zero 表示该库是不可见的,用户界面则完全取决于你. 该库完全兼容 Flash Player 10.0.0 或以上版本,这就要求 ...

  4. Clipboard.js – 现代方式实现复制文本到剪贴板

    复制文本到剪贴板应该并不难,目前已经有很成熟的 Flash 方法.但是 Flash 已经在很多场合不适用了,特别是随着 HTML5 技术的发展.今天推荐的这个 Clipboard.js 库不依赖 Fl ...

  5. JavaScript复制文本探究

    JS复制文本基本分为两步-First: 选中需要复制的节点,及选区:Second: 执行document.execCommand('copy')命令复制 对于选区,属于HTMLInputElement ...

  6. ueditor+复制word图片粘贴上传

    Chrome+IE默认支持粘贴剪切板中的图片,但是我要发布的文章存在word里面,图片多达数十张,我总不能一张一张复制吧?Chrome高版本提供了可以将单张图片转换在BASE64字符串的功能.但是无法 ...

  7. 科讯使用的:ckeditor编辑器.复制word图片.一直沾不上去.谁有好的解决办法呢

    在之前在工作中遇到在富文本编辑器中粘贴图片不能展示的问题,于是各种网上扒拉,终于找到解决方案,在这里感谢一下知乎中众大神以及TheViper. 通过知乎提供的思路找到粘贴的原理,通过TheViper找 ...

  8. CSDN中的MARKDOWN编辑器如何快速复制粘贴图片?

    前言 我们在使用csdn的markdown编辑器复制其它网站图片,按住ctrl+C复制选择图片,然后按ctrl+V粘贴图片到md编辑器无任何反应!markdown编辑器每次都没法复制粘贴截图! 下面小 ...

  9. 【原】文本图片自适应高度小bug以及解决办法

    自定义cell的文本图片自适应高度代码,如果存在自定义的cell赋值封装,就必须将自适应高度代码写在这个方法中

  10. 百度ueditor 拖文件或world 里面复制粘贴图片到编辑中 上传到第三方问题

    我这边从world 里面复制粘贴图片到编辑器中,它自动给我上传了,但是我是用的第三方的要设置一个token值,我找了很久,也没有找到应该在哪里设置这个上传的参数,如果是点击图片上传,我知道在dialo ...

随机推荐

  1. CentOS 7.9 安装 Containerd-1.6.5

    一.CentOS 7.9 安装 Containerd-1.6.5 地址 https://containerd.io/downloads 在安装containerd前,我们需要优先升级libseccom ...

  2. jsp页面重定向后地址栏controller名重复而导致报404错误

    今天做ssm项目时遇到了这种错误 看看代码: 无关代码省略... 22 <body> 23 <div id="container"> 24 <ifra ...

  3. Nacos基本学习

    一.注册中心 1.启动 1.下载nacos 在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码: GitHub主页:https://github.com/ali ...

  4. SpringBoot 过滤器和拦截器

    过滤器 实现过滤器需要实现 javax.servlet.Filter 接口.重写三个方法.其中 init() 方法在服务启动时执行,destroy() 在服务停止之前执行. 可用两种方式注册过滤器: ...

  5. springboot整合项目-商城个人头像上传功能

    上传头像的功能 持久层 1.sql语句的规划 avatar varchar(50) str - 字节流 将对象文件保存在操作系统上,然后在把这个文件的路径个记录下来,保存在avatar中,因为相比于字 ...

  6. VUE学习2

    目录分析 public目录 index.html是起始的html文件 # 这是关键 <div id="app"></div> src目录 main.js是V ...

  7. 2022-11-02 Acwing每日一题

    逆序对的个数 给定一个长度为 n 的整数数列,请你计算数列中的逆序对的数量. 逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i<j 且 a[i]>a[j],则其为一个逆 ...

  8. go如何编写命令行(cli)程序

    创建一个命令行程序 问题 如何使用golang创建可以在命令行当中传递参数的程序?go如何带参数执行程序? 比如我们期望使用hello -version来查看hello程序的版本号码.或者输入hell ...

  9. Gorm源码学习-数据库连接

    1 前言 gorm源码地址: Gorm , 本文基于commit:cef3de694d9615c574e82dfa0b50fc7ea2816f3e 官方入门指南: Dosc 2 连接数据库代码示例 目 ...

  10. C温故补缺(十):输入输出

    输入输出 printf()和scanf() 用来格式化输入输出,它们都是有返回值的 int printf()返回输出的内容的长度 #include<stdio.h> int main(){ ...