The code uses Windows API calls to read and write into the clipboard.
It provides a ClipboardHelper, an easy to use API bridge, which offers, in addition, functions to serialize complex clipboard data to hard disk and restore them when you want, using the
XmlSerializer, instead of the .NET Framework which can manage only CLR compliant data.
I tested it with Internet Explorer, Word, OpenOffice, including with image files.
The .NET framework and the
Windows.Forms.Clipboard class allows to manipulate only serializable data. So what happens if your clipboard contains data from a non-compliant application? Easy! The .NET Framework thinks that the clipboard is empty.
To read and manipulate these data, we need to call user32.dll and kernerl32.dll.
Using the code
The code includes two projects: the library ClipboardHelper, and the console application ClipboardTest.
The whole code is commented, to understand the API usage and the implemented saving process.
To use the library is really easy: it's a static class that exposes a
static void ClipboardHelper.Serialize function to serialize the clipboard data to hard disk, and
static void Deserialize to deserialize it and place it back into the clipboard, ready to be pasted.
Console.WriteLine("restore the demo clipboard");
Console.WriteLine("serialize clipboard to " + fileName);
Console.WriteLine("restore the clipboard " + fileName);
The test application shows an example of the
ClipboardHelper in action. It deserializes the clipboard, after having copied some rows from Internet Explorer at the CodeProject homepage, backs it up, and deserializes it again, from the backup. After you run it, you have the clipboard backup in your own clipboard, ready to be pasted.
Inside the ClipboardHelper
Data returned by API calls are saved in
[Serializable]DataClip objects. It allows to easily send the clipboard in a remoting context, and to save it via the
public static void SaveToFile(ReadOnlyCollection<DATACLIP> clipData, string clipName)
IEnumerator<DATACLIP> cData = clipData.GetEnumerator();
XmlSerializer xml = new XmlSerializer(typeof(DataClip));
using (StreamWriter sw = new StreamWriter(di.FullName +
@"\" + i.ToString() + ".cli",false))
Deep into the clipboard
The clipboard contains data in fragmented buffers. Each of them has a specific
DataFormat that is used by the clipboard viewer and the software from which data has been copied, to recognize how to correctly render the buffer.
returns the array of
s contained in the clipboard. For each
, we can call
. It returns the handle to the clipboard object. By calling
, we obtain the clipboard object properties (its length and the pointer to it), so we can copy the clipboard object into our buffer (a
array) via the
To get the clipboard, first of all, check to open the clipboard:
Then, we get all
DataFormats; querying them we get the clipboard data buffer:
List<DataClip> clipData = new List<DataClip>();
uint format = 0;
while ((format = Win32ClipboardAPI.EnumClipboardFormats(format)) != 0)
StringBuilder formatName = new StringBuilder();
IntPtr pos = Win32ClipboardAPI.GetClipboardData(format);
UIntPtr lenght = Win32MemoryAPI.GlobalSize(pos);
IntPtr gLock = Win32MemoryAPI.GlobalLock(pos);
buffer = new byte[(int)lenght];
int l = Convert.ToInt32(lenght.ToString());
Marshal.Copy(gLock, buffer, 0, l);
DataClip cd = new DataClip(format,
- 08/23/2006 - Initial release.
- 08/29/2006 - The whole saving system has been changed, implementing the
XmlSerializer. It works better, solving the bugs in the writing file process.
25 years old, began coding from basic, since 1992.
Interested in coding database management windows and web application, in C#, Xml, Sql, Asp.Net
Soon will be a dentist, but yet doesn't not know if will use hands or robots to cure the teeth.
Actually own and work for Italian softwarehouse Vigo s.r.l.: www.vigoline.it