6

【c#】从外部复制文本、图片到我的软件中的解决方案(支持ppt,qq等) - 从南到北ss

 1 year ago
source link: https://www.cnblogs.com/younShieh/p/17010572.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

原文地址 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格式。一般情况下可以直接调用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)
{
}

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK