原文地址 https://www.cnblogs.com/younShieh/p/17010572.html ❤如果本文對你有所幫助,不妨點個關註和推薦呀,這是對筆者最大的支持~❤ 我們先考慮一般會從什麼地方複製文本、圖片到我們的軟體中。 首先說文本。我們可能會從文本文件,網頁,word,ppt,q ...
原文地址 https://www.cnblogs.com/younShieh/p/17010572.html
❤如果本文對你有所幫助,不妨點個關註和推薦呀,這是對筆者最大的支持~❤
我們先考慮一般會從什麼地方複製文本、圖片到我們的軟體中。
首先說文本。我們可能會從文本文件,網頁,word,ppt,qq,微信,甚至是vsCode等等地方進行複製。能進行文本複製的地方千奇百怪,但是他們使用的都是通用文本容器控制項(TextBlock、TextBox等),這些控制項的底層複製操作都是一樣的,都是將字元串放置到剪切板中。我們只需要獲取剪切板中的數據就可以獲取到想要的文本數據。當然,如果需要獲取特殊樣式的文本,比如加粗效果、斜體等效果的文字,還需要特殊處理。
註意,如果複製PPT元素時,只是框選中了文字進行複製的話,是可以進行文字粘貼的。但是如果複製的是PPT整個文本框元素,就不行。PPT會提前把這個元素轉換為對應圖片保存到剪切板中。你想去獲取文本時,文本為空,這個元素只能轉換為圖片,甚至預設還有白色背景。。。如果能對PPT進行元素級的解析,則可以轉換為文字。WPS同理。
其次是圖片。能進行圖片複製的地方就沒那麼多了,我們主要考慮常見的地方,比如電腦本機,網頁,ppt,qq,微信等。不同的地方複製的圖片在剪切板中的存儲方式也可能不同,這就需要不同的處理方式。大致可以區分為源文本複製和點陣圖數據複製。
- 獲取剪切板對象
IDataObject dataObject = Clipboard.GetDataObject();
- 分析剪切板數據
通過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)
{
}