The following console application is fully functional working code to demonstrate how to create a custom clipboard format, when these standard formats will not suffice.
In below example source code specifically, we are creating a custom class Infopic to paste onto the clipboard.
Result:
When you copy an image from a browser, and paste into MSPaint, you'll get the expected image.
When you paste into Notepad, you'll get a text message.
See it in action with my tool - https://clipboardplaintextpowertool.blogspot.com/. When you copy an image, you also to get metadata for images like this;
Clip iss063e070805.jpg [1041w✕585h] "NASA Image of the Day | NASA - Microsoft Edge", img src="https://www.nasa.gov/sites/default/files/styles/full_width_feature/public/thumbnails/image/iss063e070805.jpg"
using System;
using System.Collections.Generic;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Imaging;
using System.Drawing;
using System.Diagnostics;
namespace ClipboardCustomFormatEx
{
class InfoPic
{
public System.Drawing.Image imgctnr { get; set; } //image container
public string info { get; set; } //image caption
}
class Program
{
[STAThread] //TIP! Set this to get clipboard handle from a console app
public static void Main(string[] args)
{
Console.WriteLine("Right-click COPY a image from your open brower. Press any key to start...");
Console.ReadKey();
//Let's grab clipboard - Do we have access and is there data
System.Windows.Forms.IDataObject iData = Clipboard.GetDataObject();
if (iData == null)
return;
//check is we have standard Bitmap format available
if (!iData.GetDataPresent(DataFormats.Bitmap))
return;
Bitmap clipBMP = iData.GetData(DataFormats.Bitmap) as Bitmap;
if (clipBMP == null)
return;
string imgInfo = "This image is a Bitmap " + clipBMP.PixelFormat.ToString();
//Create on custom object to place on clibpoard.
InfoPic obj = new InfoPic();
//Load object
obj.imgctnr = clipBMP;
obj.info = imgInfo;
//Some suggests we should serialize the object before placeing onto clipboard but not required
//Set and use a custom format that represents our object with clipboard. It can be any name, using "AssemblyName"."ClassName", in this case. No need to "register" foramt ahead of time, any longer as in C using RegisterClipboardFormatA
string myCustomFormat = "ClipboardCustomFormatEx.InfoPic";
Clipboard.SetData(myCustomFormat, obj);
Console.WriteLine("Success. ClipboardCustomFormatEx.InfoPic is pasted on clipboard. Press any key to continue...");
Console.ReadKey();
Console.WriteLine("Okay. Let's get grab the ClipboardCustomFormatEx.InfoPic object from the clipboard.");
//Let's get all data ojbects to check if clipboard is accessible and initialize object
IDataObject clipobj = Clipboard.GetDataObject();
if (iData == null)
return;
//Does custom format live on clipboard
if (Clipboard.ContainsData(myCustomFormat) == false)
return;
InfoPic myPaste = clipobj.GetData(myCustomFormat) as InfoPic; //cast is safe
Console.WriteLine("ClipboardCustomFormatEx.info = " + myPaste.info);
Console.WriteLine("ClipboardCustomFormatEx.imgctnr size = " + myPaste.imgctnr.Size);
Console.WriteLine("Success. Got ClipboardCustomFormatEx.InfoPic. Press any key to repaste to overload regular formats.");
Console.ReadKey();
Clipboard.Clear();
//re-paste to test using standard formats acceptable to most programs
System.Windows.Forms.IDataObject objFormatstoPaste = new DataObject();
objFormatstoPaste.SetData(DataFormats.Text, "Repasted Image");
Bitmap repasteBMP = (Bitmap)myPaste.imgctnr;
repasteBMP.RotateFlip(RotateFlipType.RotateNoneFlipY); //upside down
objFormatstoPaste.SetData(DataFormats.Bitmap, repasteBMP);
Clipboard.SetDataObject(objFormatstoPaste, true);
Console.WriteLine("Success. ClipboardCustomFormatEx.InfoPic is pasted on clipboard.");
Console.WriteLine("Open Notepad and paste (CTRL-V), you'll get text. Open MSPaint and you'll paste the image!");
Console.ReadKey();
}
}
}

No comments:
Post a Comment