首页 > 编程语言 >【c#】获取剪切板中复制文本、图片等数据

【c#】获取剪切板中复制文本、图片等数据

时间:2022-12-29 20:00:14浏览次数:43  
标签:c# dataObject DataFormats 复制 剪切板 文本 图片

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

  首先说文本。我们可能会从文本文件,网页,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格式。一般情况下可以直接调用GetImage()方法获取图片。
特殊的,DIB格式需要单独处理,某些截图软件使用的是这个格式进行存储。
ppt中有透明图层的图片复制出来有白色背景,可以使用InteropBitmap类型进行渲染。
代码如下:

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)
    {
        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)
{
}

 

 

出处:https://www.cnblogs.com/younShieh/p/17010572.html

标签:c#,dataObject,DataFormats,复制,剪切板,文本,图片
From: https://www.cnblogs.com/mq0036/p/17013415.html

相关文章

  • Linux开启ssh并允许root登录(ubuntu、centos、kalilinux)
    1、Ubuntu开启ssh服务及允许root登录1)安装ssh服务器端Ubuntu默认没有安装ssh的server,需要安装apt-getinstallopenssh-serverssh客户端是默认安装的,连接其它ssh服......
  • EFCore——树形结构篇
    1、整体数据量不大的场景参照:EntityFrameworkLinq查询数据获得树形结构-YES开发框架网(yesdotnet.com)核心方法GetChildData,特点将所有的数据查到内存中,利用递归去组......
  • ArcGIS Pro2.8插入公里网
    usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingArcGIS.Core.CIM;usingArcGIS.Core.D......
  • MongoDB从入门到实战之Docker快速安装MongoDB
    前言   在上一篇文章中带领带同学们快速入门MongoDB这个文档型的NoSQL数据库,让大家快速的了解了MongoDB的基本概念。这一章开始我们就开始实战篇教程,为了快速把Mong......
  • CentOS7开启telnet服务端,配合进行ssh升级
    默认情况下,linux’操作系统我们都是通过ssh进行远程操作,开启telnet一般是在升级ssh的时候需要,开启telnet是为了防止升级ssh之后,无法通过ssh登录系统,可用telnet登录。1.......
  • FreeSWITCH给Say模块增加中文语音
    本文更新于2022-04-04,使用FreeSWITCH1.10.7。以下示例,假定源代码目录为/usr/src/freeswitch,安装目录为/usr/local/freeswitch。安装中文Say模块(包括zh和zh_CN的Say接......
  • Alibaba Nacos初体验
    Windows10nacos-server-2.1.2.zipnacos-client:2.0.4/2.1.0(依赖的jar包)-- 序章官方介绍:Nacos/nɑ:kəʊs/是DynamicNamingandConfigurationService的首......
  • Codeforces Round #764 E
    E.Masha-forgetful题链结论就是任何长的串都可以被2,3长度的串表示后面就是暴力hash和很常规的dp[i]表示前i个是否匹配了voidsolve(){intn,m;cin>>n>>m;tu......
  • MySQL CEIL() 函数,向上取整
    MySQLCEIL()函数MySQLCEIL()函数返回大于或等于指定数字的最小整数值。CEIL()函数等同于CEILING()函数。如果您想要返回小于或等于指定数字的最小整数值,请使用FL......
  • <<你必须知道的495个C语言问题>>
    title:<<你必须知道的495个C语言问题>>categories:C书籍一.声明与初始化我该用哪种类型如果你定义明确的溢出特征,不想把正负号牵扯在内的话如果你希望操作二进制......